无限循环占用100%的CPU资源

3

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

我需要一个算法,可以生成某些赫兹到千赫兹的频率。

我正在使用C#的Windows平台。


1
你看过不同的计时器类吗? - Oded
这是您正在寻找的内容吗?https://dev59.com/OXVC5IYBdhLWcg3wtzoQ - tranceporter
4个回答

3

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

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


2
我会这样处理这个问题:生成“声波”,并将其输出到声卡上。 有办法从C#访问您的声卡,例如使用XNA。 正如其他人指出的那样,使用CPU不是一个好的方法。

0

由于您正在生成计时器,因此您希望根据频率的周期进行休眠。

您将不得不在其自己的线程中运行频率生成器并调用

Thread.Sleep(yourFrequencyPeriodMs);

在每个周期的迭代中。


0

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

它可以减少处理器的使用率


2
使用 Thread.Sleep 可能无法获得足够高的分辨率。当调用 Sleep 时,它只规定了最小的睡眠时间,在繁忙的系统上,Thread.Sleep(1) 可能会睡眠更长的时间(这可能比指定的 Khz 时间还要长)。 - Matthew
Thread.sleep 明确不是正确的方法,正如 Matthew 所提到的。我需要生成1KHz频率...使用较少 CPU 负载的微秒定时器事件对我也可以起作用。 - Danish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接