【问题标题】:Stop a thread flooding the CPU without 'sleep'停止没有“睡眠”的线程淹没 CPU
【发布时间】:2019-11-29 03:21:20
【问题描述】:

我有一个将 x/y 坐标发送到某个输出的线程。如果没有 Sleep(1) ,它会锤击 CPU(我的 CPU 为 13%) - 但输出非常平滑。使用 Sleep(1) 时,CPU 使用率下降到 1%,但会感觉到轻微的卡顿。我觉得我需要一个 Sleep(0.5) 什么的。只需将线程从 100% 拉回即可。但是亚毫秒级的睡眠似乎是不可能的。

【问题讨论】:

  • 你可以试试Thread.Sleep(0);。如果有另一个同等优先级的线程等待,它基本上只会挂起线程。如果它被挂起,它会立即进入等待队列。
  • 我已经尝试过这个和相同的问题,当设置为 0 时它会运行 CPU。然而,这让我想知道 - 如果设置为零并且我将其优先级设置为“最低”,那么它占用我的 CPU 的 15% 是否重要?因为如果 CPU 开始 100% 起床,它就会开始挂起这个线程?
  • 是的,如果你没有达到 100% 的使用率,那么老实说没有什么好担心的。
  • 如果这是关于可视化的,那么您必须选择至少 24Hz 的刷新率或更新率才能获得流畅的视觉感知。这是人眼处理图像的速率。这至少是 T = 1/f = 1/24Hz = 0,04166 秒 = 41,66 毫秒。
  • 如果不是将更新从提供者推送到输出,而是从提供者拉取更新,那会怎样?更新 x/y 值,并使用计时器以您需要的频率轮询这些值。您的显示器可能只能以 60 fps 刷新,因此更新速度可能没有意义。

标签: c# multithreading cpu throttling


【解决方案1】:

您的Thread.Sleep 的最大精度约为 > 10 毫秒。因此,如果您想获得更高的精度,则需要专用硬件。这可以是 CPU、GPU 甚至是音频时钟。

如果您使用 CPU,您会看到高工作负载只是为了获得正确的时间。根据您的需要,您可以选择一个。

这里还有更多信息:Most accurate timer in .NET?

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 2013-01-17
    • 2011-03-28
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多