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?
Nicht, dass ich weiß, wenn Sie 'sleep_until' verwenden. – chris
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) –
Ich benutzte 'select' auf einem leeren fdset –