如何获得windows上每个线程的CPU使用率(win32)
寻找Win32 API函数,C ++或Delphi示例代码,告诉我一个线程的CPU使用率(百分比和/或总CPU时间)(而不是一个进程的总数)。 我有线程ID。
我知道,Sysinternals进程资源pipe理器可以显示这些信息,但我需要在我的程序中的这些信息。
您必须使用这些函数来获取每个线程和进程的CPU使用情况。
GetThreadTimes (检索指定线程的时间信息。)
GetProcessTimes (检索指定进程的时间信息。)
GetSystemTime (获取当前系统的date和时间,系统时间以协调世界时UTC表示)
这里有一篇Dobb博士的Win32 Performance Measurement Options的优秀文章
再见。
您引用的数据可以使用特定的WMI调用。 您可以查询Win32_Process以获取各种特定于进程的信息,并查询Win32_PerfFormattedData_PerfProc_Process以获取线程数,并给出一个线程的句柄(我相信您在寻找的),您可以查询Win32_PerfRawData_PerfProc_Thread以获取使用的处理器时间的百分比。
有一个可用于Delphi的库,它为大多数WMI查询提供了包装,但是需要一些实验来获得所需的确切查询。 查询语法是非常像SQL,例如在我的系统上返回的处理器时间百分比为threadid 8,为进程id 4是:
SELECT PercentProcessorTime FROM Win32_PerfRawData_PerfProc_Thread WHERE IdProcess=4 and IdThread=8
提供有关正在运行的进程的统计信息的大多数程序现在都使用WMI来查询此信息。
在RRUZ上面的答案的帮助下,我终于想出了Borland Delphi的这个代码:
const THREAD_TERMINATE = $0001; THREAD_SUSPEND_RESUME = $0002; THREAD_GET_CONTEXT = $0008; THREAD_SET_CONTEXT = $0010; THREAD_SET_INFORMATION = $0020; THREAD_QUERY_INFORMATION = $0040; THREAD_SET_THREAD_TOKEN = $0080; THREAD_IMPERSONATE = $0100; THREAD_DIRECT_IMPERSONATION = $0200; THREAD_SET_LIMITED_INFORMATION = $0400; THREAD_QUERY_LIMITED_INFORMATION = $0800; THREAD_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $03FF; function OpenThread(dwDesiredAccess: DWord; bInheritHandle: Bool; dwThreadId: DWord): DWord; stdcall; external 'kernel32.dll'; procedure TForm1.Button1Click(Sender: TObject); var iii:integer; handle:thandle; creationtime,exittime,kerneltime,usertime:filetime; begin Handle:=OpenThread(THREAD_SET_INFORMATION or THREAD_QUERY_INFORMATION, False, windows.GetCurrentThreadId); if handle<>0 then begin getthreadtimes(Handle,creationtime,exittime,kerneltime,usertime); label1.caption:='Total time for Thread #'+inttostr(windows.GetCurrentThreadId)+': '+inttostr( (int64(kerneltime)+int64(usertime)) div 1000 )+' msec'; CloseHandle(Handle); end; end;
重要的是要知道,在某些情况下,一个线程的执行时间可能是毫无价值的。 对于多核系统,每个线程的执行时间通常每15毫秒更新一次,因此如果一个线程在此之前完成任务,运行时将被重置。 更多的细节可以在链接上得到: GetThreadTimes函数,我很惊讶的结果!
为什么GetThreadTimes是错误的
使用“GetThreadTimes”? 如果您测量调用“GetThreadTimes”之间的时间并存储以前的用户和/或内核时间,那么您知道自上次检查后线程已经有多less时间了。 你也知道在这段时间内已经过了多less时间,因此你可以计算出CPU使用的时间。 最好(为了定时器分辨率的原因)每隔一秒左右进行一次检查,并计算出平均CPU使用率。