我目前正在尝试编写一个应用程序,该应用程序每秒恰好运行相同的代码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循环来等待再次运行计算()。有没有办法阻止这种情况的发生?我不想让我的程序将要运行的计算机变慢。不幸的是,System.Thread.Thread.Sleep也是非常“不准确”的,但如果没有其他解决方案,我可以使用它。
我基本上问的是:有没有一种方法可以减少无限循环的CPU消耗?有没有其他方法可以准确地等待特定的时间?
发布于 2012-06-08 08:50:09
timeBeginPeriod(1)和一个普通的定时器或Thread.Sleep应该能正常工作。
请注意,这具有全局效果。有人声称它会增加功耗,因为它会迫使windows计时器更频繁地运行,从而缩短CPU的休眠时间。这意味着你通常应该避免使用它。但是如果你需要非常精确的时间,这肯定是一个比忙碌等待更好的选择。
发布于 2012-06-08 08:31:39
我相信你知道,Windows不是一个实时操作系统,所以永远不能保证你的代码会像你想要的那样频繁运行。
话虽如此,就屈服于其他线程而言,最有效的方法可能是使用Thread.Sleep()作为计时器。如果您想要比缺省值更高的精度,您可以发出一个分辨率为毫秒的timeBeginPeriod。该函数必须是来自winmm.dll的DLLImported。
https://stackoverflow.com/questions/10941676
复制相似问题