2011-10-30 4 views
8

Chcę wykonać powyższą operację w milisekundach jako jednostkę. Którą bibliotekę i wywołanie funkcji preferuję?Praca w trybie uśpienia w C++, platforma: windows

Ty.

+0

Funkcja [Uśpienie] (http://msdn.microsoft.com/en-us/library/ms686298%28VS.85%29.aspx)? – Praetorian

+0

Czy jesteś pewien, że sen jest najlepszym rozwiązaniem? Zwykle tak nie jest. –

+0

Jeśli potrzebujesz spać przez kilka milisekund, zwróć uwagę, że funkcja uśpienia() może mieć rozdzielczość 10 ms lub więcej. –

Odpowiedz

5

Można użyć funkcji Sleep z Win32 API.

+0

LOL. Ten sam pierwszy link do google, ale pokonałeś mnie do 45 sekund. – ksming

2

program do planowania zadań systemu Windows ma granularność znacznie przekraczającą 1 ms (zazwyczaj 20 ms). możesz to sprawdzić, używając licznika wydajności, aby zmierzyć czas faktycznie spędzony w funkcji Sleep(). (używanie QueryPerformanceFrequency() i QueryPerformanceCounter() pozwala mierzyć czas w dół do nanosekundy). zauważ, że Sleep(0) powoduje, że wątek jest uśpiony przez możliwie najkrótszy czas.

można jednak zmienić to zachowanie, używając timeBeginPeriod() i upływając okres 1 ms. teraz Sleep(0) powinien wrócić znacznie szybciej.

Zauważ, że to wywołanie funkcji zostało stworzone do odtwarzania strumieni multimediów z większą dokładnością. Nigdy nie miałem z tym żadnego problemu, ale potrzeba tak szybkiego okresu jest dość rzadka. w zależności od tego, co próbujesz osiągnąć, mogą istnieć lepsze sposoby na uzyskanie pożądanej dokładności, bez uciekania się do tego "hacka".

6

Lub jeśli używasz Visual Studio 2010 (lub inny C++ 0x świadomy kompilatora) stosowanie

#include <thread> 
#include <chrono> 

std::this_thread::sleep(); 

// or 
std::this_thread::sleep_for(std::chrono::milliseconds(10)); 

przypadku starszych kompilatorów można mieć taką samą wygodę przy użyciu odpowiedniego Boost Libraries

Niewątpliwie największą zaletą jest tutaj przenośność oraz łatwość konwersji opóźnienia pa rameter do jednostek "ludzkich".

+2

To nie zadziała w 2010 roku. VS 2012, tak, ale nie w 2010 roku. – OldPeculier

+2

@OldPeculier Co oznacza, że ​​jest to teraz powszechnie stosowana odpowiedź, lata w dół drogi :) – sehe