最近要写一个windows下的监控客户端,需要收集计算机的一些信息。
其中CPU使用率、可用物理内存(用于计算内存使用率)、上传/下载速率、磁盘读写速率,都需要实时的。各种资料查询之后,决定使用pdh性能计数器来做。
下面直接贴实现函数。需要注意的有几点:1、首先需要导入pdh的lib库;2、注意接收pdh函数的返回值,判断程序运行状态;3、需求是要收集实时值,所以开一个线程,每秒调用一次实现函数即可;4、在通过pdh函数获取数据时,需要延时,否则会导致数据不准确;5、网速的查询是特别的,因为查询语句中会带有网络适配器的名称,也就是网卡名,对于多张网卡的情况,需要自行确定走的是哪个网卡。而不同计算机名称都会不同,所以将该变量放在配置文件中,以保证代码的一致。
还有个疑问,不知道为什么PdhCollectQueryData()需要调用两次,调用一次收集会失败。
最后收集的数据放在结构体中,并压入队列,等待上传到服务端。目前实现是每收集到一组数据就上传一次,当然也可以通过链表长度和时间来控制上传频率。
由于数据最终是以二进制流的方式上传到服务端,所以结构体定义成了类的形式,带了打包、解包函数。如下:
//用于保存搜集的实时数据
class RealtimeData : public MY_OBJECT
{
public:
int iCPUUsage; // CPU使用率
double dbDownloadSpeed; // 下载速率
double dbUploadSpeed; // 上传速率
int iMemory; // 可用内存(M)
double dbDiskRead; // 磁盘读速率
double dbDiskWrite; // 磁盘写速率
INT64 time; // 本次搜集的本机时间
public:
//把内部结构打包成char*格式的扁平格式
//外部需