如何在Delphi中跟踪线程的Cpu使用情况

时间:2011-01-14 16:10:46

标签: multithreading delphi cpu-usage

我有一个运行多个线程的程序,但有些线程有时会使CPU过载。所以我需要将这些线程的CPU使用率限制为%50,这在Delphi中是否可能?

编辑:抱歉,我的问题不明确。

我实际上想知道如何跟踪线程(至少使用其线程ID创建一个线程列表)并查看每个线程使用多少CPU。但我想这样做,所以我可以看到哪个线程负责CPU过载。

抱歉再次给您带来不便。

3 个答案:

答案 0 :(得分:3)

我认为您的问题的答案可以在以下Stack Overflow问题中找到:How to get the cpu usage per thread on windows (win32)

但是,我建议你尽力理解你的程序为什么会这样做并攻击问题的根源而不是杀死你不喜欢的任何线程。当然,如果所讨论的程序纯粹是供您自己私人使用,那么您的方法可能是完全权宜和务实的。但是如果你正在编写专业软件,那么我就无法看到杀死繁忙线程的情况听起来像是一种合理的方法。

答案 1 :(得分:2)

据我所知,你不能“限制CPU使用率”,不是在Delphi中,也不是在Windows本身。

您可能想要其他东西:不要干扰用户操作或其他线程。但如果没有任何事情发生且用户没有做任何事情,为什么跑得比你慢?只需使用100%的CPU,没人需要它!

因此,如果您需要这些线程不干扰用户操作,只需使用Windows函数SetThreadPriority将它们设置为较低优先级。它们只会在用户不需要处理器电源时运行。

为其他线程提供更多机会运行的另一个技巧,在线程主体中不时调用Sleep(0)。每次调用Sleep()时,都会要求操作系统切换到另一个线程,简单来说就是这样。

答案 2 :(得分:0)

我使用框架中的一些代码(http://www.csinnovations.com/framework/framework.htm)跟踪我所有应用程序中每个线程的每个线程的滚动CPU使用率。日志输出如下所示:

15/01/2011 11:17:59.631,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,内存检查,详细,全局,“系统分配内存= 8282615808字节(自上次更改) check = 4872478720 bytes)“

15/01/2011 11:17:59.632,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,内存检查,详细,全局,“进程分配的内存= 152580096字节(自上次更改) check = -4579328 bytes)“

15/01/2011 11:17:59.633,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,CPU检查,详细,全局,“系统CPU使用率= 15.6%(终身平均值) = 3.0%)“

15/01/2011 11:17:59.634,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,CPU检查,详细,全局,“处理CPU使用率= 0.5%(生命周期平均值) = 0.7%)“

15/01/2011 11:17:59.634,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,CPU检查,详细,全局,“线程CPU使用率= 0.0%(生命周期平均值) = 0.0%)“

15/01/2011 11:17:59.634,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,CPU检查,详细,全局,“线程CPU使用率= 0.0%(生命周期平均值) = 0.0%)“

15/01/2011 11:17:59.634,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,CPU检查,详细,全局,“线程CPU使用率= 0.0%(生命周期平均值) = 0.0%)“

15/01/2011 11:17:59.635,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,CPU检查,详细,全局,“线程CPU使用率= 0.1%(生命周期平均值) = 0.1%)“

15/01/2011 11:17:59.635,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,CPU检查,详细,全局,“线程CPU使用率= 0.0%(生命周期平均值) = 0.0%)“

15/01/2011 11:17:59.635,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,CPU检查,详细,全局,“线程CPU使用率= 0.3%(生命周期平均值) = 0.5%)“

15/01/2011 11:17:59.635,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,CPU检查,详细,全局,“线程CPU使用率= 0.0%(生命周期平均值) = 0.0%)“

15/01/2011 11:17:59.635,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,CPU检查,详细,全局,“线程CPU使用率= 0.0%(生命周期平均值) = 0.0%)“

15/01/2011 11:17:59.636,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,CPU检查,详细,全局,“线程CPU使用率= 0.0%(生命周期平均值) = 0.0%)“

15/01/2011 11:17:59.636,Misha,MISHA-DCDEL,得分客户端,V0.2.0.1,主线程,CPU检查,详细,全局,“线程CPU使用率= 0.1%(生命周期平均值) = 0.1%)“

时间段是可配置的,我倾向于使用10秒,1分钟或10分钟。查看CsiSystemUnt.pas和AppGlobalsUnt.pas文件,了解它是如何完成的。

干杯,Misha

PS我也会检查内存使用情况。