Ich weiß, dass die POSIX- sleep(x)Funktion das Programm für x Sekunden in den Ruhezustand versetzt. Gibt es eine Funktion, mit der das Programm in C ++ für x Millisekunden in den Ruhezustand versetzt wird ?
Sie sollten sich bewusst sein , dass in Windows wie auch immer, Sleep()Millisekunde hat Präzision , aber es ist die Genauigkeit kann um Größenordnungen höher sein. Sie können denken, Sie schlafen für 4 Millisekunden, aber tatsächlich für 400 schlafen.
John Dibling
5
@ John Dibling: Ich denke, er verwendet POSIX sleep, nicht win32 Sleepmit "x Sekunden".
CB Bailey
1
Obwohl C und C ++ unterschiedliche Namen haben, was zu Fehlern und Inkompatibilitäten führen kann, ist es in den meisten Fällen in Ordnung, C-Header in C ++ zu verwenden. Wenn Sie jedoch absolut sicher sein möchten, dass nichts schief geht, befindet sich #includeder C-Header in einem extern "C" {}Block. Wenn Sie C- und C ++ - Quelldateien im selben Projekt haben, wird dringend empfohlen, dies zu tun, um Probleme zu vermeiden, insbesondere wenn Sie dieselben Header in beide Arten von Quelldateien einfügen (in diesem Fall ist dies erforderlich). . Wenn Sie ein reines C ++ - Projekt haben, funktioniert es möglicherweise überhaupt nicht.
Adam10603
2
@ JohnDibling nein, nicht 400ms. Die schlechteste Präzision, die Sie jemals bekommen haben könnten, war Windows 9x GetTickCountmit einer Auflösung von 55 ms. spätere Versionen hatten eine Auflösung von 16 ms oder weniger. Ein Benutzer dachte, er würde eine Auflösung von 16 ms aus dem Schlaf erhalten , berichtete dann aber, dass er Sleepselbst ziemlich genau sei und die offensichtliche Ungenauigkeit durch die GetTickCountMessung des Zeitablaufs verursacht wurde.
Qwertie
Antworten:
457
Beachten Sie, dass es keine Standard-C-API für Millisekunden gibt. Sie müssen sich also (unter Unix) damit zufrieden geben usleep, was Mikrosekunden akzeptiert:
Beachten Sie, dass in einer Umgebung mit mehreren Threads boost::this_thread::sleepIhrem Code ein Unterbrechungspunkt hinzugefügt wird. boost.org/doc/libs/1_49_0/doc/html/thread/…
Sie müssen <unistd.h> bzw. <Windows.h> einschließen.
Gbmhunter
Ja, aber konnte die tatsächliche Zeitauflösung nicht 15-16 ms betragen (selbst wenn die Einheit im Anruf 1 ms beträgt) und somit die Mindestzeit 15-16 ms betragen?
Peter Mortensen
33
Abhängig von Ihrer Plattform haben Sie möglicherweise usleepoder nanosleepverfügbar. usleepist veraltet und wurde aus dem neuesten POSIX-Standard gelöscht; nanosleepIst bevorzugt.
Eines der Probleme mit diesem Code besteht darin, dass es sich um eine Besetztschleife handelt, die weiterhin 100% eines einzelnen Prozessorkerns verwendet. Die Sleep-Funktion wird um einen Betriebssystemaufruf herum implementiert, der den aktuellen Thread in den Ruhezustand versetzt und etwas anderes ausführt und den Thread erst nach Ablauf der angegebenen Zeit aufweckt.
Ismael
Sie haben Recht - es wird 100% eines Kerns mit einer CPU verbrauchen. Also hier ist Code mit Systemschlaffunktionen umgeschrieben - und es ist immer noch plattformübergreifend:
Bart Grzybicki
@BartGrzybicki Ich weiß, dass dies eine alte Antwort ist, aber in Visual Studio 2017 auf einem Windows-Computer wird #ifdef WIN32standardmäßig nicht als wahr ausgewertet.
KayleeFrye_onDeck
2
@kayleeFrye_onDeck Code ist falsch. Es sollte sein #ifdef _WIN32.
Contango
1
@ Contango das wusste ich! Aber nicht als ich das schrieb ... lol. Vielen Dank für das Follow-up!
KayleeFrye_onDeck
17
nanosleepist eine bessere Wahl als usleep- es ist widerstandsfähiger gegen Interrupts.
Verwenden Sie das Wort "Standard" nicht, wenn Sie es nicht wirklich meinen. <concrt.h>ist kein Standardbibliotheksheader - es kann sich um eine Plattformbibliothek handeln; In diesem Fall sollten Sie die Voraussetzungen klar angeben.
Toby Speight
5
Auf Plattformen mit der selectFunktion (POSIX, Linux und Windows) können Sie Folgendes tun:
void sleep(unsignedlong msec){
timeval delay ={msec /1000, msec %1000*1000};int rc =::select(0, NULL, NULL, NULL,&delay);if(-1== rc){// Handle signals by continuing to sleep or return immediately.}}
Kann nicht scheinen, in VS2017 auf einem Windows-Computer zu kompilieren:error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
kayleeFrye_onDeck
@kayleeFrye_onDeck Es wird kompiliert. Verlinkt einfach nicht. Suchen Sie nach Windows-Dokumenten.
Maxim Egorushkin
Welchen Header verwenden Sie für Timeval?
Totte Karlsson vor
@TotteKarlsson <sys/time.h>.
Maxim Egorushkin
4
Der Weg, um Ihr Programm in C ++ zu schlafen, ist die Sleep(int)Methode. Die Header-Datei dafür ist#include "windows.h."
Zum Beispiel:
#include"stdafx.h"#include"windows.h"#include"iostream"usingnamespace std;int main(){int x =6000;Sleep(x);
cout <<"6 seconds have passed"<< endl;return0;}
Die Schlafzeit wird in Millisekunden gemessen und ist unbegrenzt.
Was meinst du damit, dass es keine Grenzen gibt? Es hat sicherlich eine Grenze, die 0xFFFFFFFE ist. Das Warten auf 0xFFFFFFFF läuft einfach nicht ab (was bedeutet, dass es bis zum Ende des Programms wartet).
Izzy
Ich habe es nicht so gemeint, Izzy, entschuldige unser Missverständnis. Ich meinte, dass Sie eine beliebige positive Anzahl von Millisekunden eingeben können. Es wird also so viele Millisekunden warten, bis das Programm geschlossen ist. Wenn Sie nicht verstehen, sagen Sie es bitte, ich werde Ihnen mehr erklären.
Phi
Ja, aber wie hoch ist die tatsächliche Zeitauflösung? Könnte es in einigen Fällen nicht 15-16 ms sein? Wenn Sie beispielsweise Sleep (3) verwenden, wird es tatsächlich 3 ms lang schlafen oder werden es stattdessen 15-16 ms sein?
Peter Mortensen
3
Mit Select Call können Sie präziser vorgehen (die Ruhezeit kann in Nanosekunden angegeben werden).
Während dies ein wertvoller Hinweis zur Lösung des Problems sein kann, zeigt eine gute Antwort auch die Lösung. Bitte bearbeiten Sie , um einen Beispielcode bereitzustellen, der zeigt, was Sie meinen. Alternativ können Sie dies stattdessen als Kommentar schreiben.
Toby Speight
3
Verwenden Sie asynchrone Eingabe- / Ausgabe-Threads von Boost und halten Sie x Millisekunden lang im Ruhezustand.
Was passiert eigentlich, wenn Sie versuchen, 3 Millisekunden zu schlafen? Werden es stattdessen 15-16 Millisekunden sein? Hast du es gemessen?
Peter Mortensen
1
Die Frage ist alt, aber ich habe es geschafft, einen einfachen Weg zu finden, dies in meiner App zu haben. Sie können ein C / C ++ - Makro wie folgt erstellen: Verwenden Sie es:
Sleep()
Millisekunde hat Präzision , aber es ist die Genauigkeit kann um Größenordnungen höher sein. Sie können denken, Sie schlafen für 4 Millisekunden, aber tatsächlich für 400 schlafen.sleep
, nicht win32Sleep
mit "x Sekunden".#include
der C-Header in einemextern "C" {}
Block. Wenn Sie C- und C ++ - Quelldateien im selben Projekt haben, wird dringend empfohlen, dies zu tun, um Probleme zu vermeiden, insbesondere wenn Sie dieselben Header in beide Arten von Quelldateien einfügen (in diesem Fall ist dies erforderlich). . Wenn Sie ein reines C ++ - Projekt haben, funktioniert es möglicherweise überhaupt nicht.GetTickCount
mit einer Auflösung von 55 ms. spätere Versionen hatten eine Auflösung von 16 ms oder weniger. Ein Benutzer dachte, er würde eine Auflösung von 16 ms aus dem Schlaf erhalten , berichtete dann aber, dass erSleep
selbst ziemlich genau sei und die offensichtliche Ungenauigkeit durch dieGetTickCount
Messung des Zeitablaufs verursacht wurde.Antworten:
Beachten Sie, dass es keine Standard-C-API für Millisekunden gibt. Sie müssen sich also (unter Unix) damit zufrieden geben
usleep
, was Mikrosekunden akzeptiert:quelle
usleep
?nanosleep
kann eine bessere Wahl sein, dausleep
es veraltet ist.In C ++ 11 können Sie dies mit Standardbibliotheksfunktionen tun:
Klar und lesbar, Sie müssen nicht mehr raten, welche Einheiten die
sleep()
Funktion benötigt.quelle
sleep_for
?Um tragbar zu bleiben, können Sie Boost :: Thread zum Schlafen verwenden:
Diese Antwort ist ein Duplikat und wurde bereits in dieser Frage veröffentlicht . Vielleicht könnten Sie dort auch einige brauchbare Antworten finden.
quelle
boost::this_thread::sleep
Ihrem Code ein Unterbrechungspunkt hinzugefügt wird. boost.org/doc/libs/1_49_0/doc/html/thread/…Unter Unix können Sie usleep verwenden .
In Windows gibt es Schlaf .
quelle
Abhängig von Ihrer Plattform haben Sie möglicherweise
usleep
odernanosleep
verfügbar.usleep
ist veraltet und wurde aus dem neuesten POSIX-Standard gelöscht;nanosleep
Ist bevorzugt.quelle
usleep()
in<unistd.h>
verwirrenderweisenanosleep()
in<time.h>
/ deklariert wird<ctime>
.Warum nicht die time.h Bibliothek benutzen? Läuft auf Windows- und POSIX-Systemen:
Korrigierter Code - CPU bleibt jetzt im IDLE-Status [24.05.2014]:
quelle
#ifdef WIN32
standardmäßig nicht als wahr ausgewertet.#ifdef _WIN32
.nanosleep
ist eine bessere Wahl alsusleep
- es ist widerstandsfähiger gegen Interrupts.quelle
usleep
, aber nichtnanosleep
. Sie sollten ein Beispiel für die Verwendung unter Linux angeben.Syntax:
Verwendungszweck:
quelle
#include <WinBase.h>
#include <windows.h>
Wenn Sie MS Visual C ++ 10.0 verwenden, können Sie dies mit Standardbibliotheksfunktionen tun:
du wirst brauchen:
quelle
<concrt.h>
ist kein Standardbibliotheksheader - es kann sich um eine Plattformbibliothek handeln; In diesem Fall sollten Sie die Voraussetzungen klar angeben.Auf Plattformen mit der
select
Funktion (POSIX, Linux und Windows) können Sie Folgendes tun:Heutzutage gibt es jedoch bessere Alternativen.
quelle
error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
<sys/time.h>
.Der Weg, um Ihr Programm in C ++ zu schlafen, ist die
Sleep(int)
Methode. Die Header-Datei dafür ist#include "windows.h."
Zum Beispiel:
Die Schlafzeit wird in Millisekunden gemessen und ist unbegrenzt.
quelle
Mit Select Call können Sie präziser vorgehen (die Ruhezeit kann in Nanosekunden angegeben werden).
quelle
Verwenden Sie asynchrone Eingabe- / Ausgabe-Threads von Boost und halten Sie x Millisekunden lang im Ruhezustand.
quelle
Die Frage ist alt, aber ich habe es geschafft, einen einfachen Weg zu finden, dies in meiner App zu haben. Sie können ein C / C ++ - Makro wie folgt erstellen: Verwenden Sie es:
quelle
Aus C ++ 14 mit std und seinen numerischen Literalen:
quelle
Als Win32-Ersatz für POSIX-Systeme:
quelle
nanosleep()
anusleep()
: Letztere ist veraltet und hat sich von der jüngsten POSIX - Standard gelöscht.