寻找CPU函数,C++或Win32示例代码,告诉我一个线程的CPU使用率(百分比和/或总CPU时间)(而不是一个进程的总时间)。我有线程ID。
我知道Sysinternals Process Explorer可以显示此信息,但我需要在我的程序中显示此信息。
发布于 2009-09-08 22:16:05
在上面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;
发布于 2009-09-08 10:07:38
您必须使用这些函数来获取每个线程和进程的cpu使用率。
GetThreadTimes (检索指定线程的计时信息。)
GetProcessTimes (检索指定进程的计时信息。)
GetSystemTime (检索当前系统日期和时间。系统时间以协调世界时( UTC)表示
这里有一篇来自Dobb博士的Win32 Performance Measurement Options的优秀文章
再见。
发布于 2009-09-08 18:21:40
您引用的数据可以通过特定的WMI调用获得。您可以查询Win32_Process以获取各种特定于进程的信息,查询Win32_PerfFormattedData_PerfProc_Process以获取线程数,并给定线程的句柄(我相信您正在寻找的句柄),您可以查询Win32_PerfRawData_PerfProc_Thread以获取处理器使用时间的百分比。
有一个library available for Delphi为大多数的WMI查询提供了包装器,但是它需要一些实验才能得到你想要的确切的查询。查询语法非常类似于sql,例如,在我的系统上,返回threadid 8的处理器时间百分比,进程id 4的查询语法是:
SELECT PercentProcessorTime FROM Win32_PerfRawData_PerfProc_Thread
WHERE IdProcess=4 and IdThread=8
现在,提供有关运行进程的统计信息的大多数程序都使用WMI来查询此信息。
https://stackoverflow.com/questions/1393006
复制相似问题