如何获得每个线程的CPU使用率在Windows上的(Win32)(How to get the cp

2019-07-05 16:17发布

寻找Win32 API函数,C ++或Delphi样本代码,告诉我一个螺纹(未总要处理)的CPU占用率(百分比和/或总的CPU时间)。 我有线程ID。

我知道的Sysinternals的Process Explorer可以显示此信息,但我需要我的程序这里面的信息。

Answer 1:

您必须使用这些功能,让每线程和进程的CPU占用率。

GetThreadTimes (中检索时序指定的线程信息。)

GetProcessTimes (中检索时序指定的进程的信息。)

GetSystemTime (获取当前系统日期和时间,系统时间是协调世界时UTC表示)

从道博博士这里,优秀文章的Win32性能测试选项

再见。



Answer 2:

你指的这些数据可使用特定的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来查询这些信息。



Answer 3:

重要的是要知道,在某些情况下,一个线程的执行时间可能一文不值。 每个线程的执行时间是每15毫秒通常更新的多核系统中,因此,如果一个线程完成前这段时间的任务,运行时将被重置。 更多详情可链接获得: GetThreadTimes运作,我对结果感到惊讶!
而为什么GetThreadTimes是错误的



Answer 4:

随着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;


Answer 5:

使用 “GetThreadTimes”? 如果测量到“GetThreadTimes”调用之间的时间和存储以前的用户和/或内核时间,那么你知道自上次检查线程已经多少时间了。 你还知道多少时间的平均时间已经过去,因此可以计算出有多少CPU时间使用。 这将是最好的(定时器分辨率的原因),使这个检查每一秒左右,在这第二制定出它的平均CPU使用率。



Answer 6:

下面是一个简单的WMI查询包装。 有了它的帮助,你可以调用它来获取数据:

getWmiQueryResult(L"SELECT PercentProcessorTime FROM Win32_PerfRawData_PerfProc_Thread WHERE IdProcess=4 and IdThread=8", L"PercentProcessorTime ");

你可能也想看看Win32_PerfRawData_PerfProc_Thread文档,看看有什么其他的属性,你可以获取。



文章来源: How to get the cpu usage per thread on windows (win32)