寻找Win32 API函数,C ++或Delphi样本代码,告诉我一个螺纹(未总要处理)的CPU占用率(百分比和/或总的CPU时间)。 我有线程ID。
我知道的Sysinternals的Process Explorer可以显示此信息,但我需要我的程序这里面的信息。
寻找Win32 API函数,C ++或Delphi样本代码,告诉我一个螺纹(未总要处理)的CPU占用率(百分比和/或总的CPU时间)。 我有线程ID。
我知道的Sysinternals的Process Explorer可以显示此信息,但我需要我的程序这里面的信息。
您必须使用这些功能,让每线程和进程的CPU占用率。
GetThreadTimes (中检索时序指定的线程信息。)
GetProcessTimes (中检索时序指定的进程的信息。)
GetSystemTime (获取当前系统日期和时间,系统时间是协调世界时UTC表示)
从道博博士这里,优秀文章的Win32性能测试选项
再见。
你指的这些数据可使用特定的WMI调用。 您可以查询Win32_Process的得到各种过程的具体信息,并查询Win32_PerfFormattedData_PerfProc_Process得到线程数,并给出一个处理一个线程(我相信你找),您可以查询Win32_PerfRawData_PerfProc_Thread得到使用的处理器时间的百分比。
有一个可用的德尔福库提供包装对于大多数WMI查询,但它会采取一些试验,让您寻找准确的查询。 查询语法是非常像的sql,例如我的系统返回的处理器时间的百分比为线程ID 8,进程ID 4:
SELECT PercentProcessorTime FROM Win32_PerfRawData_PerfProc_Thread
WHERE IdProcess=4 and IdThread=8
其中大部分呈现有关正在运行的进程的统计信息的程序现在使用WMI来查询这些信息。
重要的是要知道,在某些情况下,一个线程的执行时间可能一文不值。 每个线程的执行时间是每15毫秒通常更新的多核系统中,因此,如果一个线程完成前这段时间的任务,运行时将被重置。 更多详情可链接获得: GetThreadTimes运作,我对结果感到惊讶!
而为什么GetThreadTimes是错误的
随着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;
使用 “GetThreadTimes”? 如果测量到“GetThreadTimes”调用之间的时间和存储以前的用户和/或内核时间,那么你知道自上次检查线程已经多少时间了。 你还知道多少时间的平均时间已经过去,因此可以计算出有多少CPU时间使用。 这将是最好的(定时器分辨率的原因),使这个检查每一秒左右,在这第二制定出它的平均CPU使用率。
下面是一个简单的WMI查询包装。 有了它的帮助,你可以调用它来获取数据:
getWmiQueryResult(L"SELECT PercentProcessorTime FROM Win32_PerfRawData_PerfProc_Thread WHERE IdProcess=4 and IdThread=8", L"PercentProcessorTime ");
你可能也想看看Win32_PerfRawData_PerfProc_Thread文档,看看有什么其他的属性,你可以获取。