【问题标题】:How can I track a thread's Cpu usage in Delphi如何在 Delphi 中跟踪线程的 Cpu 使用情况
【发布时间】:2011-01-14 16:10:45
【问题描述】:

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

编辑:对不起,我的问题不清楚。

我实际上想知道如何跟踪线程(至少创建一个带有线程 ID 的线程列表)并查看每个线程使用了多少 CPU。但我想这样做是为了查看哪个线程导致 CPU 过载。

再次抱歉给您带来不便。

【问题讨论】:

  • 以比你想以更高优先级运行的线程低的优先级运行线程。
  • 所有线程都在做同样的事情。但有时一些线程开始使 CPU 过载..
  • @waffles 我也想知道“CPU 过载”是什么意思。您能否详细说明症状。
  • @waffles 你需要问问你自己为什么那个线程会这样。如果你乐于在它行为不端时杀死它,那么你为什么需要它。为什么不通过从不启动有问题的线程来回避问题呢?你正在射击信使。

标签: multithreading delphi cpu-usage


【解决方案1】:

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

但是,我建议您努力了解您的程序为什么会这样,并从根本上解决问题,而不是杀死您不喜欢的任何线程。当然,如果所讨论的程序纯粹是为了您自己的私人使用,那么您的方法可能是完全权宜之计和实用的。但是,如果您正在编写专业软件,那么我看不出杀死繁忙线程听起来是一种合理的方法。

【讨论】:

    【解决方案2】:

    据我所知,您不能“限制 CPU 使用率”,无论是在 Delphi 中还是在 Windows 本身中。

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

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

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

    【讨论】:

    • 问题是:“如何在 Delphi 中跟踪线程的 Cpu 使用情况”
    • @Dorin 再次阅读问题。那是标题,但问题特别询问如何限制它。也许应该修改标题以反映问题,但这并不能证明投反对票是合理的。
    【解决方案3】:

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

    15/01/2011 11:17:59.631,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,Memory Check,Verbose,Globals,"系统分配内存 = 8282615808 字节(自上次更改检查 = 4872478720 字节)"

    15/01/2011 11:17:59.632,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,Memory Check,Verbose,Globals,"进程分配内存 = 152580096 字节(自上次以来的变化检查 = -4579328 字节)"

    15/01/2011 11:17:59.633,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,CPU Check,Verbose,Globals,"系统 CPU 使用率 = 15.6 %(生命周期内的平均值) = 3.0 %)"

    15/01/2011 11:17:59.634,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,CPU Check,Verbose,Globals,"进程 CPU 使用率 = 0.5 %(生命周期内的平均值) = 0.7 %)"

    15/01/2011 11:17:59.634,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,CPU Check,Verbose,Globals,"线程 CPU 使用率 = 0.0 %(生命周期内的平均值) = 0.0 %)"

    15/01/2011 11:17:59.634,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,CPU Check,Verbose,Globals,"线程 CPU 使用率 = 0.0 %(生命周期内的平均值) = 0.0 %)"

    15/01/2011 11:17:59.634,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,CPU Check,Verbose,Globals,"线程 CPU 使用率 = 0.0 %(生命周期内的平均值) = 0.0 %)"

    15/01/2011 11:17:59.635,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,CPU Check,Verbose,Globals,"线程 CPU 使用率 = 0.1 %(生命周期内的平均值= 0.1 %)"

    15/01/2011 11:17:59.635,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,CPU Check,Verbose,Globals,"线程 CPU 使用率 = 0.0 %(生命周期内的平均值= 0.0 %)"

    15/01/2011 11:17:59.635,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,CPU Check,Verbose,Globals,"线程 CPU 使用率 = 0.3 %(生命周期内的平均值) = 0.5 %)"

    15/01/2011 11:17:59.635,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,CPU Check,Verbose,Globals,"线程 CPU 使用率 = 0.0 %(生命周期内的平均值= 0.0 %)"

    15/01/2011 11:17:59.635,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,CPU Check,Verbose,Globals,"线程 CPU 使用率 = 0.0 %(生命周期内的平均值= 0.0 %)"

    15/01/2011 11:17:59.636,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,CPU Check,Verbose,Globals,"线程 CPU 使用率 = 0.0 %(平均生命周期= 0.0 %)"

    15/01/2011 11:17:59.636,Misha,MISHA-DCDEL,Scores Client,V0.2.0.1,Main Thread,CPU Check,Verbose,Globals,”线程 CPU 使用率 = 0.1 %(平均整个生命周期= 0.1 %)"

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

    干杯,米莎

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

    【讨论】:

      猜你喜欢
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多