我目前正在尝试编写一个运行相同代码的应用程序,每秒运行100次。我已经使用.NET框架的内置计时器进行了一些测试。我测试了System.Threading.Timer类,System.Windows.Forms.Timer类和System.Timers.Timer类。对于我想要做的事情,它们似乎都不够准确。 我已经发现了PerformanceCounters,我目前正在尝试在我的应用程序中实现这一点。 但是,当我的程序在空闲时占用我的CPU的整个核心时,我遇到了一些麻烦。 我只需要它每秒活动100次。我的循环看起来像这样:
long nextTick, nextMeasure;
QueryPerformanceCounter(out start);
nextTick = start + countsPerTick;
nextMeasure = start + performanceFrequency;
long currentCount;
while (true)
{
QueryPerformanceCounter(out currentCount);
if (currentCount >= nextMeasure)
{
Debug.Print("Ticks this second: " + tickCount);
tickCount = 0;
nextMeasure += performanceFrequency;
}
if (currentCount >= nextTick)
{
Calculations();
tickCount++;
nextTick += countsPerTick;
}
}
正如您所看到的,大多数情况下程序将不断地通过while循环再次运行Calculations()。有没有办法阻止这种情况发生?我不想减慢我的程序将运行的计算机速度。 不幸的是,System.Thread.Thread.Sleep也非常“不准确”,但如果没有其他解决方案,我可以使用它。
我基本上要问的是:有没有办法让无限循环减少CPU密集?有没有其他方法可以准确地等待特定的时间?
答案 0 :(得分:2)
我确信你知道,Windows不是实时操作系统,所以永远不能保证你的代码会按照你想要的频率运行。
话虽如此,在屈服于其他线程方面效率最高的可能是使用Thread.Sleep()作为计时器。如果您想要比默认值更高的精度,则可以将所需分辨率的timeBeginPeriod发布到毫秒。该函数必须是从winmm.dll DLLImported。
答案 1 :(得分:1)
timeBeginPeriod(1)
以及普通计时器或Thread.Sleep
应该可以正常工作。
请注意,这会产生全局影响。有人声称它会增加功耗,因为它会迫使Windows计时器更频繁地运行,从而缩短CPU休眠时间。这意味着你通常应该避免它。但如果你需要高度精确的计时,它肯定是一个比繁忙等待更好的选择。