5

我有一个有 2 个线程的应用程序(现在),但功能 Thread.Sleep() 似乎不是很好。它使线程休眠,但需要更多时间(例如-我想让它休眠 5 毫秒,它会休眠 0.3 秒或更长时间)。这是代码:

int vlakien = 2;
Thread[] vlakna; 
vlakna = new Thread[vlakien];

for (int i = 0; i < vlakien; i++) 
{ try { vlakna[i] = new Thread(new ThreadStart(utok)); vlakna[i].Start(); } }

private void utok()
{
  //some code
  Thread.Sleep(5);
  //some code
}

此外,我尝试在函数 utok 中使用 Stopwatch 使其入睡,这也需要更多时间:

Stopwatch SW = new Stopwatch(); SW.Start();
while(SW.ElapsedMilliseconds < 5000) ;

请帮忙。

4

5 回答 5

9

15ms 是 Windows 上的线程时间片(您实际上可以弄乱 Windows 并更改它......完全不推荐)。事情可以提前释放他们的时间片,但任何事情都可以占用他们的全部时间片。

所以很难得到比这更好的结果,实际上,20 或 30 毫秒的可能性更大。我曾经进行实时处理,其硬实时限制为 50 毫秒。如果您遵守某些规则(在 C++ 中),这在 Windows 上运行良好

于 2012-01-13T01:33:54.397 回答
5

正如其他人所指出的,睡眠的默认分辨率为 10 或 15 毫秒,具体取决于 Windows 的版本。

但是,您可以通过发出

timeBeginPeriod(1);
timeEndPeriod(1);

在哪里

[DllImport(WINMM)]
internal static extern uint timeBeginPeriod(uint period);   

我们在串行通信服务中执行此操作,其中能够及时准确地间隔发送很重要。有些人不愿意这样做,因为它会导致 Windows 也更频繁地执行基于计时器的其他事情。实际上,这对我们没有造成明显的问题,我们有数百个安装,每个安装都连​​接了数百个串行设备。

于 2012-01-13T02:04:24.047 回答
1

Microsoft C# 中的睡眠保证了最少的时间。它的睡眠时间少于 5 毫秒绝对是个问题。此外,秒表可能不是非常精确的测量,请尝试使用高精度媒体计时器。

于 2012-01-13T01:28:14.943 回答
0

它受系统时钟分辨率的影响。它大约是 15 毫秒……你不能低于系统时钟的分辨率。看看这个链接(它是 C++,但你会了解计时器分辨率)。

于 2012-01-13T01:29:37.503 回答
0

传递给 Thread.Sleep 的参数是睡眠的最短时间,而不是准确的时间。

于 2012-01-13T01:31:50.543 回答