Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# while循环中的性能计数器_C#_Multithreading_Winapi_Cpu_Performancecounter - Fatal编程技术网

C# while循环中的性能计数器

C# while循环中的性能计数器,c#,multithreading,winapi,cpu,performancecounter,C#,Multithreading,Winapi,Cpu,Performancecounter,我目前正在尝试编写一个应用程序,该应用程序以每秒100次的速度运行相同的代码。我已经使用.NET framework的内置计时器进行了一些测试。我已经测试了System.Threading.Timer类、System.Windows.Forms.Timer类和System.Timers.Timer类。对于我正在尝试做的事情,它们似乎都不够准确。 我已经了解了PerformanceCounters,目前正试图在我的应用程序中实现它。 然而,我的程序在空闲时占用了整个CPU核心,这让我有点麻烦。 我

我目前正在尝试编写一个应用程序,该应用程序以每秒100次的速度运行相同的代码。我已经使用.NET framework的内置计时器进行了一些测试。我已经测试了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密集度降低?有没有其他方法可以准确地等待特定的时间量?

我相信您已经知道,Windows不是实时O/S,因此永远无法保证您的代码能够按您所希望的频率运行


话虽如此,就让位于其他线程而言,最有效的方法可能是使用Thread.Sleep()作为计时器。如果想要比默认值更高的精度,可以发出一个timeBeginPeriod,所需分辨率低至毫秒。该函数必须从winmm.dll进行dlliPorted。

我相信您也知道,Windows不是实时O/S,因此无法保证您的代码能够按您所需的频率运行

话虽如此,就让位于其他线程而言,最有效的方法可能是使用Thread.Sleep()作为计时器。如果想要比默认值更高的精度,可以发出一个timeBeginPeriod,所需分辨率低至毫秒。该函数必须从winmm.dll进行dlliPorted。

与正常计时器或
线程一起使用。睡眠应正常工作

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

加上正常的计时器或
线程。睡眠
应该可以正常工作


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

非常感谢您的快速响应。我知道Windows不是一个实时操作系统。我不知道你可以使用你发布的功能要求降低分辨率。非常感谢。我将进一步研究这一点,看看它是否有助于我使我的程序更加CPU友好。非常感谢您的快速响应。我知道Windows不是一个实时操作系统。我不知道你可以使用你发布的功能要求降低分辨率。非常感谢。我将进一步研究这一点,看看它是否有助于我使我的程序更加CPU友好。谢谢你的回复!我使用了PerformanceCounter和Thread.Sleep的组合,现在就睡吧,它似乎对我正在做的事情足够准确。我的CPU使用率一直下降到0-1%,每秒都有100个滴答声。所以不需要增加分辨率,也不需要增加功耗,嗯?:)@haiyyu据我所知,启用
timeBeginPeriod(1)
会稍微增加功耗。但肯定没有繁忙的等待那么多。不幸的是,我在这方面没有确切的数字。那么,我想知道我两个都没有用是件好事。:)如果你对几只蜱聚在一起没问题,那也没关系。但是如果你想让滴答声间隔10毫秒,你需要
timeBeginPeriod
。如果你没有它也能满足你的需求,那当然很好。把几个蜱虫聚在一起不是问题。它们应该在一秒钟内分布。这当然是好的方式,因为它的工作完美。谢谢你的回应!我使用了PerformanceCounter和Thread.Sleep的组合,现在就睡吧,它似乎对我正在做的事情足够准确。我的CPU使用率一直下降到0-1%,每秒都有100个滴答声。所以不需要增加分辨率,也不需要增加功耗,嗯?:)@haiyyu据我所知,启用
timeBeginPeriod(1)
会稍微增加功耗。但肯定没有繁忙的等待那么多。不幸的是,我在这方面没有确切的数字。那么,我想知道我两个都没有用是件好事。:)如果你对几只蜱聚在一起没问题,那也没关系。但是如果你想让滴答声间隔10毫秒,你需要
timeBeginPeriod
。如果你没有它也能满足你的需求,那当然很好。把几个蜱虫聚在一起不是问题。它们应该在一秒钟内分布。这当然是好的方式,因为它的作品完美。