【问题标题】:Infinite looping consumes 100% CPU无限循环消耗 100% CPU
【发布时间】:2012-09-25 14:18:10
【问题描述】:

我陷入了需要生成一些赫兹的定义频率的情况。我已经尝试过多媒体计时器和互联网上所有其他可用的东西,但到目前为止,带有一些 if-else 条件的无限循环给了我最好的结果。但是这种方法的问题是它几乎消耗了所有的cpu,没有空间让其他应用程序正常工作。

我需要一种算法,它可以生成一些 Hz 到 KHz 的频率。

我正在使用带有 C# 的 windows 平台。

【问题讨论】:

标签: c# cpu-usage infinite-loop time-frequency


【解决方案1】:

您无法在非实时平台上准确生成固定频率的信号。在任何时候,来自同一进程或其他进程的高优先级线程都可能会阻塞线程的执行。例如。当 GC 线程启动时,工作线程将被挂起。

话虽如此,您允许的抖动是多少,您需要支持的最高频率是多少?

【讨论】:

    【解决方案2】:

    我解决问题的方法是生成“声波”并在声卡上输出。 有一些方法可以从 C# 访问您的声卡,例如使用 XNA。 正如其他人指出的那样,为此使用 CPU 并不是一个好方法。

    【讨论】:

      【解决方案3】:

      在你的循环中使用Thread.Sleep(delay);

      减少处理器使用率

      【讨论】:

      • 使用Thread.Sleep 可能无法为它们提供足够高的分辨率。当调用Sleep 时,它只规定了它将休眠的最短时间,因此在繁忙的系统上Thread.Sleep(1) 可能会休眠超过 1 毫秒(无论如何这可能会比指定的 Khz 长)。
      • Thread.sleep 绝对不是 Matthew 正确提到的方式。我需要生成 1KHz 的频率...具有较少 cpu 负载的微秒计时器事件也适用于我。
      【解决方案4】:

      当您生成计时器时,您可能希望根据您的频率周期来睡眠。

      您必须在自己的线程中运行频率发生器并调用

      Thread.Sleep(yourFrequencyPeriodMs);
      

      在每个周期的迭代中。

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 1970-01-01
        • 2012-01-26
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        • 2021-11-06
        相关资源
        最近更新 更多