Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problems with using Thread.Sleep for short times

I have an app with 2 threads (now), but it seems that function Thread.Sleep() doesn't work very good. It sleeps threads but it takes much more time (for example- I want to sleep it for 5ms and it sleeps for 0,3s or more). Here is code:

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
}

Also I tried to sleep it with Stopwatch in the function utok and it also takes more time:

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

Please help.

like image 548
matej148 Avatar asked Jan 13 '12 01:01

matej148


2 Answers

15ms is the thread time slice on windows ( you can actually mess with windows and change that.... not at all recommended). Things can give their time slices up early, but anything could take their full time slice.

So its really hard to get any better than that, in fact, realistically 20 or 30 ms is more likely. I used to do real time processing which had a hard real time limit of 50ms. That worked well on windows if you obeyed certain rules ( it was in C++)

like image 178
Keith Nicholas Avatar answered Sep 17 '22 09:09

Keith Nicholas


As others have indicated, the default resolution of Sleep is 10 or 15 milliseconds, depending on the edition of Windows.

However, you can reprogram the timer to use a 1 millisecond resolution by issuing a

timeBeginPeriod(1);
timeEndPeriod(1);

where

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

We do this in our serial communications services where being able to accurately space out sends in time is important. Some people are reluctant to do this because it causes Windows to do other things that are based off of the timer more frequently as well. In reality this has caused no discernible issues for us, and we have hundreds of installs each with hundreds of serial devices connected.

like image 39
500 - Internal Server Error Avatar answered Sep 19 '22 09:09

500 - Internal Server Error