赞
踩
前篇我们已经实现了一个 Monitor
所需要大部分的内容。
然而,硬件资源的监控相对来说比较麻烦。
不过,我们可以借助 Qt,实际上它也提供了不少相关的 Api。
现在我们需要监控机器的硬件资源。
所谓硬件资源,主要分为三种:
1、获取磁盘使用:
Qt 中获取磁盘信息的类为 QStorageInfo
。
QStorageInfo
允许检索有关卷空间的信息,其装入点,标签和文件系统名称。
您可以通过将卷的挂载点作为构造函数参数传递给函数的挂载点来创建 QStorageInfo 的实例,或者您可以使用 setPath() 方法设置它。
静态挂载 volumes() 方法可用于获取所有已安装文件系统的列表。
QStorageInfo 始终高速缓存检索到的信息,但可以调用 refresh() 来使缓存无效。
现在我们使用他实现一个获取磁盘用量的通用接口:
QVariantList MonitorApi::getDrives() { QVariantList drives; for (const QStorageInfo &storage: QStorageInfo::mountedVolumes()) { if (storage.isValid() && storage.isReady()) { if (!storage.isReadOnly()) { QVariantMap drive; uint driveType; QString driveName = storage.name(); #ifdef Q_OS_WIN driveType = GetDriveType(LPCWSTR(storage.rootPath().utf16())); switch (driveType) { case 2: driveName = storage.name().isEmpty() ? QStringLiteral("U盘") : storage.name(); break; case 3: driveName = storage.name().isEmpty() ? QStringLiteral("本地磁盘") : storage.name(); break; case 4: driveName = storage.name().isEmpty() ? QStringLiteral("网络磁盘") : storage.name(); break; case 5: driveName = storage.name().isEmpty() ? QStringLiteral("CD-ROM 驱动器") : storage.name(); break; case 6: driveName = storage.name().isEmpty() ? QStringLiteral("RAM磁盘") : storage.name(); break; default: driveName = storage.name().isEmpty() ? QStringLiteral("磁盘") : storage.name(); break; } #endif drive["drivePath"] = storage.rootPath(); drive["driveName"] = driveName; drive["usedSize"] = storage.bytesTotal() - storage.bytesFree(); drive["totalSize"] = storage.bytesTotal(); drives.append(drive); } } } return drives; }
当然,Windows
平台的磁盘名稍有不同。
2、获取 CPU 利用率:
qreal MonitorApi::getCpuUsageRate() { qreal usageRate = 0.0; #ifdef Q_OS_WIN static FILETIME preidleTime; static FILETIME prekernelTime; static FILETIME preuserTime; FILETIME idleTime; FILETIME kernelTime; FILETIME userTime; GetSystemTimes(&idleTime, &kernelTime, &userTime); quint64 a, b; quint64 idle, kernel, user; a = (quint64(preidleTime.dwHighDateTime) << 32) | preidleTime.dwLowDateTime; b = (quint64(idleTime.dwHighDateTime ) << 32) | idleTime.dwLowDateTime; idle = b -a; a = (quint64(prekernelTime.dwHighDateTime) << 32) | prekernelTime.dwLowDateTime; b = (quint64(kernelTime.dwHighDateTime) << 32) | kernelTime.dwLowDateTime; kernel = b - a; a = (quint64(preuserTime.dwHighDateTime) << 32) | preuserTime.dwLowDateTime; b = (quint64(userTime.dwHighDateTime) << 32) | userTime.dwLowDateTime; user = b - a; usageRate = qreal(kernel + user - idle) / qreal(kernel + user); preidleTime = idleTime; prekernelTime = kernelTime; preuserTime = userTime; #endif return usageRate > 1.0 ? 1.0 : usageRate; }
3、获取内存使用率:
QVariant MonitorApi::getMemoryStatus() { QVariantMap map; #ifdef Q_OS_WIN MEMORYSTATUSEX statex; statex.dwLength = sizeof (statex); GlobalMemoryStatusEx(&statex); quint64 memoryAll = statex.ullTotalPhys; quint64 memoryFree = statex.ullAvailPhys; quint64 memoryUsed = memoryAll - memoryFree; map["usedSize"] = memoryUsed; map["totalSize"] = memoryAll; #endif return map; }
4、获取网络流量:
QVariant MonitorApi::getNetworkStatus() { QVariantMap map; #ifdef Q_OS_WIN static bool initialized = false; static quint64 preRecvTotal = 0; static quint64 preSendTotal = 0; quint64 recvTotal = 0; quint64 sendTotal = 0; MIB_IF_ROW2 *ifRow; PMIB_IF_TABLE2 ifTable; if (GetIfTable2(&ifTable) == NO_ERROR) { QSet<QString> addressSet; for (DWORD i = 0; i < ifTable->NumEntries; i++) { ifRow = (MIB_IF_ROW2 *)&ifTable->Table[i]; if (ifRow->Type == IF_TYPE_ETHERNET_CSMACD) { QString addr; for (ULONG i = 0; i < ifRow->PhysicalAddressLength; i++) { addr += QString::number(ifRow->PhysicalAddress[i], 16).rightJustified(2, '0'); } if (!addressSet.contains(addr)) { addressSet.insert(addr); recvTotal += ifRow->InOctets; sendTotal += ifRow->OutOctets; //qDebug() << i << addr << ifRow->InOctets << ifRow->OutOctets; } } } FreeMibTable(ifTable); } if (!initialized) { preRecvTotal = recvTotal; preSendTotal = sendTotal; initialized = true; } map["downloadSize"] = recvTotal - preRecvTotal; map["uploadSize"] = sendTotal - preSendTotal; map["trafficSize"] = (recvTotal + sendTotal) - (preRecvTotal + preSendTotal); preRecvTotal = recvTotal; preSendTotal = sendTotal; #endif return map; }
SkeyeARS全景AR增强监视系统, 是视开科技开发的一款基于宽场景多路视频无缝拼接、视频实时增强、监视目标增强显示、目标自动跟踪、视频存储回放、远程数据传输和多通道全景视频同步显示等功能的综合视频AR增强监视系统,广泛应用于智慧交通、智慧城市、智慧机场等大场景智能监控领域。
详细说明:http://www.openskeye.cn/web/product/ars
QQ交流群:102644504
SkeyeVSS综合安防互联网无插件播放解决方案
SkeyeARS全景AR增强监视系统解决方案
SkeyeIVMS集群式视频云管控平台解决方案
Copyright © OpenSKEYE Team 2018-2022
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。