1、写在后面
上一篇中咱们简略解说了 衰弱状态
的性能。
实际上,仅仅从效果图上看不足以理解。
所以接下来,咱们筹备好实现一个简略的 衰弱状态场景
,能力了解其弱小。
2、注释开始
首先,衰弱状态
的本质是 状态监控
,这点咱们一点要记住。
因而,咱们首先须要一个有限获取状态的 Linux 守护过程
或 Windows 服务
。
这里先简略称其为 Monitor
。
咱们的 SkeyeARS
须要 Monitor
提供所有的软硬件状态。
因而,Monitor
须要做到以下几点:
- 提供设施的软件资源监控。
而咱们次要实现的是对运行程序的监控,即所谓的 看门狗
。
所以只须要获取监控程序运行状态即可,上面是获取过程数的 Windows
实现。
int MonitorApi::getProcessCount(const QString &processName){ //过程计数 static bool initialized = false; int count = 0; QString fileName = QFileInfo(processName).fileName(); QString fullName = QDir::toNativeSeparators(QFileInfo(processName).absoluteFilePath());#ifdef Q_OS_WIN if (!initialized) { //晋升过程权限 LUID luidTmp; HANDLE tokenHnadle; TOKEN_PRIVILEGES tkp; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tokenHnadle)) { if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidTmp)) { qDebug() << "LookupPrivilegeValue Faile! Error =" << GetLastError(); CloseHandle(tokenHnadle); } tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = luidTmp; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if(!AdjustTokenPrivileges(tokenHnadle, FALSE, &tkp, sizeof(tkp), NULL, NULL)) { qDebug() << "AdjustTokenPrivileges Faile! Error =" << GetLastError(); CloseHandle(tokenHnadle); } CloseHandle(tokenHnadle); } initialized = true; } PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); //创立过程快照句柄 HANDLE processSnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //创立句柄失败 if (processSnapshotHandle == INVALID_HANDLE_VALUE) return -1; //找第一个 bool isExist = Process32First(processSnapshotHandle, &pe32); while(isExist) { auto name = QString::fromWCharArray(pe32.szExeFile); //过程名不辨别大小写 if(fileName.compare(name, Qt::CaseInsensitive) == 0) { HMODULE modules[512] = {0}; DWORD needed = 0; TCHAR mouduleName[MAX_PATH]; BOOL is64Process; HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID); if (processHandle) { IsWow64Process(processHandle, &is64Process); //判断是32位还是64位过程 EnumProcessModulesEx(processHandle, modules, sizeof(modules), &needed, is64Process ? LIST_MODULES_32BIT : LIST_MODULES_64BIT); if (needed > 0) { GetModuleFileNameEx(processHandle, modules[0], mouduleName, MAX_PATH); if (QString::fromWCharArray(mouduleName) == fullName) count++; } CloseHandle(processHandle); } } //找下一个 isExist = Process32Next(processSnapshotHandle, &pe32); }#endif return count;}
- 提供机器的硬件资源监控。
所谓硬件资源,次要分为三种:
1、磁盘应用。
2、CPU 利用率。
3、内存使用率。
4、网络流量。
- 提供状态给所有须要的零碎( 例如
SkeyeARS
)。
而如何将状态提供给其余零碎呢,一种想法应用音讯队列。
咱们能够将获取到的软硬件资源,封装后公布进来。
对于感兴趣的零碎,则能够按本人的须要,订阅音讯即可。
在咱们的 Monitor
中,采纳的音讯队列为:ZeroMQ
。
## 对于SkeyeARS ##
SkeyeARS全景AR加强监视系统, 是视开科技开发的一款基于宽场景多路视频无缝拼接、视频实时加强、监督指标加强显示、指标主动跟踪、视频存储回放、近程数据传输和多通道全景视频同步显示等性能的综合视频AR加强监视系统,广泛应用于智慧交通、智慧城市、智慧机场等大场景智能监控畛域。
具体阐明:http://www.openskeye.cn/web/product/ars