2013-06-27 4 views
6

Ich habe eine Schleife und ich möchte sicherstellen, dass es für eine (ungefähr) feste Zeit für jede Schleife ausgeführt wird.Alternative zu Std :: this_thread :: sleep_for()

Ich verwende sleep_for, um dieses Verhalten zu erreichen, aber ich möchte auch das Programm kompilieren auf Umgebungen, die nicht vollständige Unterstützung der Standard-Thread-Bibliothek enthalten. Im Moment habe ich so etwas wie diese:

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 

} 

Während dies das Programm ermöglicht in Umgebungen zu kompilieren, die nicht Standard-Threads unterstützen, es ist auch sehr CPU-intensiv wie überprüft das Programm kontinuierlich für die Zeitbedingung anstatt zu warten, bis es wahr ist.

Meine Frage ist: Gibt es eine weniger ressourcenintensive Möglichkeit, dieses Warteverhalten nur mit Standard-C++ (d. H. Nicht Boost) in einer Umgebung zu aktivieren, die Threads nicht vollständig unterstützt?

+0

Nicht, dass ich weiß, wenn Sie 'sleep_until' verwenden. – chris

+1

Das wird hart werden. Wenn Sie Boost verwenden könnten, gibt es viele zeitgesteuerte Callback-Funktionen, mit denen Sie dies leicht tun können. siehe [hier] (http://stackoverflow.com/questions/4363458/timer-callback-in-c) –

+1

Ich benutzte 'select' auf einem leeren fdset –

Antwort

2

Es gibt viele zeitbasierte Funktionen, es hängt sehr vom verwendeten Betriebssystem ab.

Microsoft API bietet Sleep() (Großbuchstaben S), die Ihnen einen Millisekunden-Schlaf bietet.

Unter Unix (POSIX) haben Sie Nanosleep().

Ich denke, dass diese beiden Funktionen Sie auf den meisten Computern laufen lassen sollten.

Die Implementierung wäre die gleiche Schleife zu verwenden, aber ein wenig in der While() -Schleife schlafen. Das wird immer noch ein Pool-ähnliches Ding sein, aber schneller viel weniger CPU-intensiv.

Auch als n.M. erwähnt, hat select() diese Fähigkeit. Es ist nur etwas komplizierter implementiert, aber es wird erwartet, dass es nach Ablauf der Zeit zurückkehrt.

+0

Danke für den Rat, ich werde diese Alternativen prüfen. Es scheint, dass die Verwendung von C++ 11-Funktionen die Verwendung von Alternativen bedingt erfordert (wie in diesem Fall), bis diese Features weitgehend unterstützt werden. – trm

Verwandte Themen