2013-06-27 12 views
6

Mam pętlę i chcę się upewnić, że działa przez około (w przybliżeniu) ustaloną ilość czasu dla każdej pętli.alternatywa dla std :: this_thread :: sleep_for()

Używam sleep_for, aby osiągnąć to zachowanie, ale chcę również, aby program mógł się kompilować w środowiskach, które nie zawierają pełnego wsparcia standardowej biblioteki wątków. Teraz mam coś takiego:

using namespace std; 
using namespace std::chrono; 

// 
while(!quit) 
{ 
    steady_clock::time_point then = steady_clock::now(); 

    //...do loop stuff 

    steady_clock::time_point now = steady_clock::now(); 
#ifdef NOTHREADS 
    // version for systems without thread support 
    while(duration_cast<microseconds>(now - then).count() < 10000) 
    { 
     now = steady_clock::now(); 
    } 

#else 
    this_thread::sleep_for(microseconds{ 10000 - duration_cast<microseconds>(now - then).count() }); 
#endif 

} 

ile umożliwia to program do kompilacji w środowiskach, które nie obsługują standardowe tematy, to jest bardzo CPU-intensywny jak program sprawdza nieustannie za stan czasu zamiast czekać aż to prawda.

Moje pytanie brzmi: czy istnieje mniej zasobochłonny sposób włączania tego zachowania "oczekiwania" przy użyciu tylko standardowego C++ (tzn. Nie zwiększania) w środowisku, które nie obsługuje w pełni wątków?

+0

Nie o tym wiem, chyba że użyjesz 'sleep_until'. – chris

+1

To będzie trudne. Jeśli możesz użyć doładowania, istnieje wiele funkcji oddzwaniania, które pozwoliłyby ci to łatwo zrobić. zobacz [tutaj] (http://stackoverflow.com/questions/4363458/timer-callback-in-c) –

+1

Używałem 'select' na pustym fdsetce –

Odpowiedz

2

Istnieje wiele funkcji opartych na czasie, bardzo zależy to od używanego systemu operacyjnego.

Microsoft API oferuje funkcję Sleep() (duże S), która zapewnia uśpienie milisekundy.

Pod Unixem (POSIX) masz nanosleep().

Wydaje mi się, że te dwie funkcje powinny umożliwić uruchomienie większości komputerów.

Wdrożenie polegałoby na użyciu tej samej pętli, ale spocznij trochę w pętli while(). To nadal będzie coś podobnego do puli, ale znacznie mniej intensywnie CPU.

Również jako n.m. wspomniano, select() ma taką możliwość. Po prostu nieco bardziej skomplikowane do implementacji, ale oczekuje się, że powróci po upływie czasu.

+0

Dzięki za radę, przyjrzę się tym alternatywom. Wydaje się, że używanie funkcji C++ 11 będzie wymagało warunkowego użycia alternatyw (jak w tym przypadku), dopóki te funkcje nie będą szeroko obsługiwane. – trm

Powiązane problemy