为了算出进程的资源占用情况,对
long long 和
unsigned long long 分别取别名为
int64_time 和
uint64_time。
因为Windows操作系统中计时的方式和我们在生活中常用的时间计量单位不同,对时间进行格式化。
利用操作系统提供的获取进程数据的方式,编写相应函数。(例如,GetSystemInfo()函数用来获取操作系统的cpu个数;GetProcessTime()函数用来获取进程的创建和结束时间,用户态和核心态模式下运行的时间)
通过公式:
system_time = (formating(&kernel_time) + formating(&user_time)) / processer_count;
time = formating(&now);
计算出某一时刻内进程的时间信息和系统当前的时间信息。
再次循环之后,算出时间差:
system_time_delta = system_time - last_system_time;
time_delta = time - last_time;
最后利用公式:算出cpu使用率。
cpu_usage_rate = int((system_time_delta *100) / time_delta);
但是,获取时间的函数
GetProcessTimes(ProcessHandle,&creation_time,&exit_time,&kernel_time,&user_time)
需要进程句柄参数,而通过对所有进程进行快照,再把快照信息中的进程ID转换成句柄时,由于权限不够,出现错误。
HANDLE hProcessSnap;
PROCESSENTRY32 pe32 = {0;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
Process32First(hProcessSnap,&pe32);
ProcessHandle = 0penProcess(PROCESs_ALL_ACCESS,false,pe32.th32ProcessID);
unsigned long kkk = GetLastError();
printf( "%d\n",kkk);
所以我在API操作手册上查了对OpenProcess的解释,我也找出了错误:
也就是跟GetLasterror()返回的错误码相符和。
我再试着对算法的进程提高权限,并且权限提高成功了,但是问题还是没有得到解决。