.net线程.sleep不准确
我快疯了!!。 我通过gsm发送音频,根据语音规范,我必须发送语音数据包,然后等待20毫秒以获得正常语音。我使用system.threading.thread.sleep(20)。然而,我注意到声音很慢,但当我运行另一个不同的应用程序时,声音变得正常 经过一些调试,我发现system.Threading.Thread.Sleep(20)需要31毫秒,但是如果我运行另一个不同的应用程序,Thread.Sleep(20)将始终是准确的 为了让线程准确地休眠20毫秒,同时又不影响PC的性能,我还可以使用哪些其他方法呢 谢谢,.net线程.sleep不准确,.net,multithreading,sleep,.net,Multithreading,Sleep,我快疯了!!。 我通过gsm发送音频,根据语音规范,我必须发送语音数据包,然后等待20毫秒以获得正常语音。我使用system.threading.thread.sleep(20)。然而,我注意到声音很慢,但当我运行另一个不同的应用程序时,声音变得正常 经过一些调试,我发现system.Threading.Thread.Sleep(20)需要31毫秒,但是如果我运行另一个不同的应用程序,Thread.Sleep(20)将始终是准确的 为了让线程准确地休眠20毫秒,同时又不影响PC的性能,我还可以使
Sleep(20)
意味着至少睡眠20毫秒。基本上,它会暂停线程,不会在指定的延迟内恢复调度。在这之后,线程仍然必须被调度以实际恢复运行。这取决于正在运行的其他线程可能是立即运行的,也可能是稍后运行的。这里没有保证
政府呼吁:
系统时钟以称为时钟分辨率的特定速率滴答作响。
实际超时可能与指定的超时不完全相同,因为
指定的超时将被调整为与时钟滴答声一致。
有关时钟分辨率和等待时间的更多信息,请参阅
睡眠功能主题。此方法从中调用Sleep函数
Windows系统API
如前所述,准确的计时通常需要一个不会被时间分割的线程/进程,要做到这一点,您必须
Spin
,而不是Sleep
选项1
如果你想要绝对的准确度,我会使用一个带有秒表的高优先级线程
bool running = true;
Thread t = new Thread(() =>
{
Stopwatch sw = Stopwatch.StartNew();
while (running)
{
if (sw.ElapsedMilliseconds >= 20)
{
RunCode();
sw.Restart();
}
}
}) { Priority = ThreadPriority.Highest, IsBackground = true };
t.Start();
// ...
running = false;
t.Join();
选项2
更纤细一点,不会在不同的线程上运行,但仍然可以旋转
while (true)
{
SpinWait.SpinUntil(() => false, TimeSpan.FromMilliseconds(20));
RunCode();
}
选项3
一些开源的高分辨率定时器代码。e、 g.如果你想获得准确的睡眠时间,你必须旋转等待,这对电脑性能不利。睡眠准确度由时钟中断率决定,默认情况下,它每秒滴答64次。每15.625毫秒一次。因此,睡眠(20)只有在两次滴答声过去后才能完成,2 x 15.625=31.25毫秒。中断率可以改变,浏览器或媒体播放器很容易改变。他们呼叫,你也可以。请注意,如果有任何问题,提高时钟中断率可能会对电池寿命产生重大影响。亲爱的汉斯,你的计算是正确的。我得到的是31毫秒&一段时间后是32毫秒,然后也是31毫秒。当我打开firefox时,对于500个读数,它会精确到20毫秒。要恢复此问题,请立即提问。。要我把时间开始定在什么时候吗?汉斯。。。你做到了。。非常感谢:)。它像魔法一样工作。我使用了timeBeginPeriod(10),一切正常。请建议如何将您的职位设置为回答者。那么,您建议使用什么?。我看到一个Java程序,它使用Thread.Sleep(20)&似乎工作得很好。这与编程语言或操作系统有关吗?&对于.net,对于我来说,在时间准确性和CPU利用率之间保持良好平衡的最佳解决方案是什么。谢谢。我希望Java应用程序也有同样的行为——至少在Windows上是这样。事实上,Java文档对超时也有相同的说明。我还有一个问题,当我使用winmme timeBegion时,它在x 32位系统中工作得很好。但在x64位系统上,它给出了奇怪的行为。请建议如何在64个系统上克服这个问题。我已经尝试了第一个选项和第二个选项,但似乎我做错了什么。秒表不能提供准确的数据。我发现时钟中断改变了一个样本解决方案。非常感谢您的大力支持。非常感谢。对不起,很可能1和2不能直接工作-我没有测试它们,应该补充说:)没有问题。亲爱的詹姆斯,非常感谢你的大力支持。非常感谢。