Проблемы с использованием Thread.Sleep на короткое время - PullRequest
5 голосов
/ 13 января 2012

У меня есть приложение с двумя потоками (сейчас), но кажется, что функция 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 SW = new Stopwatch(); SW.Start();
while(SW.ElapsedMilliseconds < 5000) ;

Пожалуйста, помогите.

Ответы [ 5 ]

9 голосов
/ 13 января 2012

15 мс - это временной интервал потока на окнах (на самом деле вы можете связываться с окнами и изменять это .... совсем не рекомендуется). Вещи могут откладывать свои временные срезы рано, но все может занять свои срезы.

Так что действительно трудно получить что-то лучше, чем на самом деле, на самом деле, реально 20 или 30 мс с большей вероятностью. Раньше я выполнял обработку в реальном времени с жестким ограничением в реальном времени 50 мс. Это хорошо работает в Windows, если вы подчиняетесь определенным правилам (это было в C ++)

5 голосов
/ 13 января 2012

Как указали другие, по умолчанию разрешение Sleep составляет 10 или 15 миллисекунд, в зависимости от редакции Windows.

Однако вы можете перепрограммировать таймер для использования разрешения 1 миллисекунды, выдав

timeBeginPeriod(1);
timeEndPeriod(1);

, где

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

Мы делаем это в наших службах последовательной связи, где очень важно иметь возможность точного распределения посылок во времени.Некоторые люди неохотно делают это, потому что это заставляет Windows делать другие вещи, которые также основаны на таймере, также чаще.На самом деле это не вызвало у нас никаких заметных проблем, и у нас есть сотни установок, каждая из которых подключена к сотням последовательных устройств.

1 голос
/ 13 января 2012

Сон в Microsoft C # гарантирует минимальное количество времени.Это спит менее 5 миллисекунд, это определенно проблема.Также секундомер может быть не очень точным измерением, попробуйте высокоточные таймеры.

0 голосов
/ 13 января 2012

Параметр передается в Thread.Sleep - это минимальное время ожидания, а не точное время.

0 голосов
/ 13 января 2012

На это влияет разрешение системных часов. Это около 15 мс ... вы не можете опускаться ниже разрешения системных часов. Взгляните на эту ссылку (это C ++, но вы получите представление о разрешениях таймера).

...