首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >while循环中的PerformanceCounter

while循环中的PerformanceCounter
EN

Stack Overflow用户
提问于 2012-06-08 08:26:28
回答 2查看 329关注 0票数 0

我目前正在尝试编写一个应用程序,该应用程序每秒恰好运行相同的代码100次。我已经使用.NET框架的内置计时器进行了一些测试。我测试了System.Threading.Timer类、System.Windows.Forms.Timer类和System.Timers.Timer类。对于我正在尝试做的事情,它们似乎都不够准确。我已经了解了PerformanceCounters,目前正在尝试在我的应用程序中实现它。然而,我的程序在空闲时占用了我整个CPU的核心,这让我遇到了一点麻烦。我只需要它每秒激活100次就行了。我的循环看起来像这样:

代码语言:javascript
复制
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消耗?有没有其他方法可以准确地等待特定的时间?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-08 08:50:09

timeBeginPeriod(1)和一个普通的定时器或Thread.Sleep应该能正常工作。

请注意,这具有全局效果。有人声称它会增加功耗,因为它会迫使windows计时器更频繁地运行,从而缩短CPU的休眠时间。这意味着你通常应该避免使用它。但是如果你需要非常精确的时间,这肯定是一个比忙碌等待更好的选择。

票数 1
EN

Stack Overflow用户

发布于 2012-06-08 08:31:39

我相信你知道,Windows不是一个实时操作系统,所以永远不能保证你的代码会像你想要的那样频繁运行。

话虽如此,就屈服于其他线程而言,最有效的方法可能是使用Thread.Sleep()作为计时器。如果您想要比缺省值更高的精度,您可以发出一个分辨率为毫秒的timeBeginPeriod。该函数必须是来自winmm.dll的DLLImported。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10941676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档