2010-11-15 15 views
413

so che la funzione POSIX sleep(x) obbliga il programma per x secondi. Esiste una funzione per far dormire il programma per x millisecondi in C++?sonno per millisecondi

+5

È necessario essere consapevoli che, in Windows in ogni caso, 'sonno()' ha millisecondo * precisione *, ma è * precisione * possono essere ordini di magnitudine più alta. Potresti pensare di dormire per 4 millisecondi, ma in realtà dormi per 400. –

+5

@John Dibling: Penso che stia usando 'POSIX' sleep', non win32 'Sleep' dato" x secondi ". –

+1

Sebbene C e C++ abbiano un diverso nome nel mangling, che può essere fonte di bug e incompatibilità, nella maggior parte dei casi è bene usare le intestazioni C in C++. Tuttavia, se si vuole essere assolutamente sicuri che nulla vada storto, '# include' l'intestazione C all'interno di un blocco" extern "C" {} '. Inoltre, se si hanno file sorgente C e C++ nello stesso progetto, si consiglia vivamente di farlo al fine di evitare qualsiasi problema, specialmente se si includono le stesse intestazioni in entrambi i tipi di file sorgente (nel qual caso è necessario) . Se si dispone di un progetto puramente C++, potrebbe funzionare senza alcun problema. – adam10603

risposta

334

Si noti che non v'è alcuna API standard C per millisecondi, così (su Unix) si dovrà accontentare di usleep, che accetta microsecondi:

#include <unistd.h> 

unsigned int microseconds; 
... 
usleep(microseconds); 
+2

Non sarebbe male se la risposta fosse sotto forma di un MWE =) – puk

+2

E 'un sonno occupato? Ho bisogno di cedere ad un altro thread durante il sonno; posso usare 'usleep' per quello? – Michael

+5

Non è un'attesa molto attesa http://stackoverflow.com/a/8156644/1206499, e 'nanosleep' può essere una scelta migliore dato che' usleep' è obsoleto. – jswetzen

74

di rimanere portatile è possibile utilizzare Boost::Thread per dormire:

#include <boost/thread/thread.hpp> 

int main() 
{ 
    //waits 2 seconds 
    boost::this_thread::sleep(boost::posix_time::seconds(1)); 
    boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); 

    return 0; 
} 

Questa risposta è una copia duplicata ed è stata pubblicata in this question prima. Forse potresti trovare anche alcune risposte utilizzabili.

+6

Ricordare che - in un ambiente a più thread, 'goost :: this_thread :: sleep' aggiunge un punto di interruzione al codice. http://www.boost.org/doc/libs/1_49_0/doc/html/thread/thread_management.html –

16

nanosleep è una scelta migliore rispetto usleep - è più resistente contro interrupt.

+3

Avevo familiarità con 'usleep', ma non' nanosleep'. Dovresti fornire un esempio di come usarlo su Linux. – jww

29

A seconda della piattaforma si può avere usleep o nanosleep disponibili. usleep è obsoleto ed è stato eliminato dallo standard POSIX più recente; nanosleep è preferito.

+2

Si noti che mentre 'usleep()' è dichiarato in '', in modo confuso, 'nanosleep()' è dichiarato in ''/''. – gbmhunter

28

In Unix è possibile utilizzare usleep.

In Windows c'è Sleep.

+3

e la chiamata di Windows è in millisecondi. – shindigo

+8

È necessario includere rispettivamente o . – gbmhunter

+0

Sì, ma la risoluzione temporale effettiva non può essere 15-16 ms (anche se l'unità nella chiamata è 1 ms) e quindi il tempo minimo è 15-16 ms? –

3

Select chiamata è un modo di avere una maggiore precisione (tempo di sonno può essere specificato in nanosecondi).

+0

Anche se questo potrebbe essere un suggerimento prezioso per risolvere il problema, una buona risposta dimostra anche la soluzione. Si prega di [modificare] per fornire un codice di esempio per mostrare cosa intendi. In alternativa, considera di scrivere questo come un commento. –

773

In C++ 11, si può fare questo con funzionalità della libreria standard:

#include <chrono> 
#include <thread> 
std::this_thread::sleep_for(std::chrono::milliseconds(x)); 

chiaro e leggibile, non più bisogno di indovinare a quale unità la funzione sleep() prende.

+4

std :: this_thread :: sleep_for definisce un punto di interruzione? Come boost :: this_thread_sleep fa? –

+39

Questo è il modo giusto per farlo. Periodo. Thread è cross platform e chrono. – Void

+43

@Void. Un buon modo certamente, ma "il" e "periodo" sono parole terribilmente forti. –

8
#include <WinBase.h> 

Sintassi:

Sleep ( __in DWORD dwMilliseconds ); 

Usage:

Sleep (1000); //Sleeps for 1000 ms or 1 sec 
+2

Che cosa è necessario includere per questo? –

+0

'#include ' – foobar

+5

No, è necessario '#include ' –

14

Perché non utilizzare time.h biblioteca? Gira su sistemi Windows e POSIX:

codice
#include <iostream> 
#include <time.h> 

using namespace std; 

void sleepcp(int milliseconds); 

void sleepcp(int milliseconds) // Cross-platform sleep function 
{ 
    clock_t time_end; 
    time_end = clock() + milliseconds * CLOCKS_PER_SEC/1000; 
    while (clock() < time_end) 
    { 
    } 
} 
int main() 
{ 
    cout << "Hi! At the count to 3, I'll die! :)" << endl; 
    sleepcp(3000); 
    cout << "urrrrggghhhh!" << endl; 
} 

Corretto - ora CPU rimane in stato di IDLE [2014/05/24]:

#include <iostream> 
#ifdef WIN32 
    #include <windows.h> 
#else 
    #include <unistd.h> 
#endif // win32 

using namespace std; 

void sleepcp(int milliseconds); 

void sleepcp(int milliseconds) // Cross-platform sleep function 
{ 
    #ifdef WIN32 
     Sleep(milliseconds); 
    #else 
     usleep(milliseconds * 1000); 
    #endif // win32 
} 
int main() 
{ 
    cout << "Hi! At the count to 3, I'll die! :)" << endl; 
    sleepcp(3000); 
    cout << "urrrrggghhhh!" << endl; 
} 
+13

Uno dei problemi con quel codice è che è un ciclo occupato, continuerà a utilizzare il 100% di un core a processore singolo. La funzione sleep è implementata attorno a una chiamata del sistema operativo che interrompe il thread corrente e fa qualcos'altro, e riattiva il thread solo quando scade il tempo specificato. – Ismael

+0

Hai ragione: consumerà il 100% di un core CPU. Quindi ecco il codice riscritto usando le funzioni sleep del sistema - ed è ancora multipiattaforma: –

3

Il modo di dormire il vostro programma in C++ è il metodo Sleep(int). Il file di intestazione perché è #include "windows.h."

Ad esempio:

#include "stdafx.h" 
#include "windows.h" 
#include "iostream" 
using namespace std; 

int main() 
{ 
    int x = 6000; 
    Sleep(x); 
    cout << "6 seconds have passed" << endl; 
    return 0; 
} 

il tempo che dorme è misurato in millisecondi, senza limite.

Second = 1000 milliseconds 
Minute = 60000 milliseconds 
Hour = 3600000 milliseconds 
+2

Cosa vuoi dire che non ha limiti? Ha sicuramente un limite che è 0xFFFFFFFE. L'attesa di 0xFFFFFFFF non andrà in timeout (il che significa che aspetterà fino alla fine del programma). – Izzy

+0

Non intendevo quello, Izzy, mi dispiace per il nostro fraintendimento. Intendevo dire che puoi inserire qualsiasi numero positivo di millisecondi. Quindi aspetterà che molti millisecondi chiudano il programma. Se non capisci per favore dì così, ti spiegherò di più. – genius

+0

Sì, ma quale è la risoluzione temporale effettiva? Potrebbe non essere 15-16 ms in alcuni casi? Ad esempio, se usi Sleep (3), in realtà dormirà per 3 ms o sarà invece 15-16 ms? –

6

Se si utilizza MS Visual C++ 10.0, è possibile farlo con funzionalità della libreria standard:

Concurrency::wait(milliseconds); 

è necessario:

#include <concrt.h> 
+2

Non usare la parola "standard" quando in realtà non lo si intende. '' è * non * un'intestazione di libreria standard - potrebbe essere una libreria di piattaforme; nel qual caso dovresti indicare chiaramente i prerequisiti. –

3

Sulle piattaforme con la funzione select (POSIX, Linux e Windows) che potreste fare:

void sleep(unsigned long 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. 
    } 
} 

Tuttavia, ci sono alternative migliori disponibili al giorno d'oggi.

2

Utilizzare Boost di thread di input/output asincroni, sleep per x millisecondi;

#include <boost/thread.hpp> 
#include <boost/asio.hpp> 

boost::thread::sleep(boost::get_system_time() + boost::posix_time::millisec(1000)); 
+0

motivo del down-vote? –

+0

Cosa succederà realmente se si tenta di dormire per 3 millisecondi? Saranno invece 15-16 millisecondi? L'hai misurato? –

0

In sostituzione Win32 per sistemi POSIX:

void Sleep(unsigned int milliseconds) { 
    usleep(milliseconds * 1000); 
} 

while (1) { 
    printf("."); 
    Sleep((unsigned int)(1000.0f/20.0f)); // 20 fps 
} 
+0

Preferisco 'nanosleep()' a 'usleep()': quest'ultimo è deprecato ed è stato eliminato dallo standard POSIX più recente. –