HANDLE hProcess; GetProcessTimes(hProcess, &ftCreation, &ftExit, &ftKernel, &ftUser); |
本文例子程序的运行界面如下图所示:
计算运行的时间
某个进程运行的时间长度是指该进程创建的时间到当前时间逝去的时间。这个信息被存储在 FILETIME 结构中。只要计算出逝去的时间,那么再将它转换成小时/分钟/秒形式。很幸运,借助 COleDateTime 类,这个工作很容易完成。
COleDateTime timeNow = COleDateTime::GetCurrentTime(), timeCreation = ftCreation; COleDateTimeSpan timeDiff = timeNow - timeCreation; |
在此你可以使用 COleDateTimeSpan 中不同的方法来获得逝去的小时/分钟等信息。
计算内核和用户时间
参考相关文档,内核和用户时间就是实际逝去的时间。这个值在 FILETIME 结构中被表示为 100 纳秒单位。将它转换成可用的信息有两种方法:
方法一:
我们可以用一些基本方法将它转换成以秒为单位的值,一纳秒相当于千万分之一秒,因为这个时间已经用 100 纳秒单位表示,所以用10个百万来除一下即可:
__int64 i64Kernel = *((__int64 *) &ftKernel); DWORD dwKernel = (DWORD) (i64Kernel / 10000000U); |
union timeKernel.ftKernel = ftKernel; |
不管哪种方法,dwKernel 都表示内核模式的进程运行逝去的秒数。再把秒数转换成小时/分钟/秒的形式就不难了。
方法二:
第二种方法只需要调用一个 API 函数就能搞掂,这个 API 函数就是 FileTimeToSystemTime,该函数将结果存储到 SYSTEMTIME 结构中,然后从结构中获取 wHour、wMinute 和 wSecond 成员。
SYSTEMTIME stKernel; FileTimeToSystemTime(&ftKernel, &stKernel); |
用户模式时间的获取可以如法炮制。
总结
本文涉及的一些 API 函数调用如下:
GetProcessTimes(hProcess, &ftCreation, &ftExit, &ftKernel, &ftUser); timeCreation = ftCreation; strData.Format("Created at %02d:%02d:%02d", timeCreation.GetHour(), timeDiff = timeNow - timeCreation; FileTimeToSystemTime(&ftKernel, &stKernel); |