2012-06-06 9 views
31

¿Es posible con las macros hacer el código de plataforma cruzada? Por ejemplo Función de suspensión de plataforma cruzada para C++

#ifdef LINUX 
#include <header_for_linux_sleep_function.h> 
#endif 
#ifdef WINDOWS 
#include <header_for_windows_sleep_function.h> 
#endif 
... 
Sleep(miliseconds); 
... 
+0

Si no te importa el procesador zumbido de distancia y tienen 11 C++, se puede usar '' . – chris

+12

¿Por qué tendría el procesador zumbando? Si tiene C++ 11, puede usar algo como 'std :: this_thread :: sleep_for (std :: chrono :: milisegundos (n))' que no debería consumir ninguna CPU. –

+0

es un C++ puro. – ElSajko

Respuesta

36

Sí, hay. Lo que se hace es envolver el diferente sistema de llamadas duerme en su propia función, así como las declaraciones como incluir a continuación:

#ifdef LINUX 
#include <unistd.h> 
#endif 
#ifdef WINDOWS 
#include <windows.h> 
#endif 

void mySleep(int sleepMs) 
{ 
#ifdef LINUX 
    usleep(sleepMs * 1000); // usleep takes sleep time in us (1 millionth of a second) 
#endif 
#ifdef WINDOWS 
    Sleep(sleepMs); 
#endif 
} 

A continuación, el código llama mySleep a dormir en lugar de hacer llamadas al sistema directos.

+7

#ifdef LINUX int Sleep (int sleepMs) {return usleep (sleepMs * 1000); } #endif – Joshua

+0

ya, eso sería genial, pero usleep no deja de consumir CPU. Por ejemplo: while (1) {usleep (1000 * 1000);/* 1sec? */Cout << 1; } Luego, después de este segundo, la salida es un montón de "1" caracteres. – ElSajko

+0

@KamilKrzyszczuk: No, 'usleep' no consume CPU, detiene por completo el proceso por un tiempo. –

18

Get Boost.

#include <boost/thread/thread.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
... 
boost::this_thread::sleep(boost::posix_time::millisec(milliseconds)); 
+6

esto ahora está en C++ 11. 'posix_time' se llama' chrono' aunque. – anthropomorphic

8

La solución estándar es la llamada select() (requiere Winsock). Esta llamada en particular tiene exactamente el mismo comportamiento en Linux y Windows.

long value; /* time in microseconds */ 

struct timeval tv; 
tv.tv_sec = value/1000000; 
tv.tv_usec = value % 1000000; 
select(0, NULL, NULL, NULL, &tf); 
+0

solución interesante, pero me gustó más su comentario sobre la respuesta de 'shf301'. –

1

En linux recuerda que usleep tiene un límite. No puede 'dormir' más de 1000 segundos.

que iba a escribir como esto

struct timespec req={0},rem={0}; 
req.tv_sec=(milisec/1000); 
req.tv_nsec=(milisec - req.tv_sec*1000)*1000000; 
nanosleep(&req,&rem); 
47

Sip. Pero esto solo funciona en C++11 y later.

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

donde ms es la cantidad de tiempo que desea dormir en milisegundos.

También puede reemplazar con millisecondsnanoseconds, microseconds, seconds, minutes o hours. (Estos son especializaciones del tipo std::chrono::duration.)

Actualización: En C++14, si usted está durmiendo por una cantidad fija de tiempo, por ejemplo, 100 milisegundos, std::chrono::milliseconds(100) se puede escribir como 100ms. Esto se debe a user defined literals, que se introdujeron en C++11. En C++14 la biblioteca chrono se ha ampliado para incluir los siguientes definidos por el usuario literales:

Efectivamente, esto significa que puede escribir algo como esto.

#include <chrono> 
#include <thread> 
using namespace std::literals::chrono_literals; 

std::this_thread::sleep_for(100ms); 

Tenga en cuenta que, mientras que using namespace std::literals::chrono_literals proporciona la menor cantidad de namespace pollution, estos operadores también están disponibles cuando using namespace std::literals, o using namespace std::chrono.

19

shf301 tenía una buena idea, pero de esta manera es mejor:

#ifdef _WINDOWS 
#include <windows.h> 
#else 
#include <unistd.h> 
#define Sleep(x) usleep((x)*1000) 
#endif 

A continuación, utilice la siguiente manera:

Sleep(how_many_milliseconds); 
+1

¡Conveniente! ¡Gracias! :) – cmcromance

-2

Sólo hacer

#include <ctime> 
int Sleep(int ms) 
{ 
    clock_t starting = clock(); 
    while(clock() - starting < ms) {} 
    return 0; 
} 

que comprueba la hora actual (en milisegundos), resta el tiempo de inicio de la misma, lo que da la cantidad de tiempo utilizada por la función. Si ese número es menor que el valor crítico (longitud de tiempo objetivo), entonces no hace nada, matando una pequeña cantidad de tiempo. Eso se repite hasta que el tiempo excede el valor crítico, donde se detiene.

EDIT: fija los errores de código

Cuestiones relacionadas