2010-11-24 32 views
34

Parece imposible dormir un hilo usando boost :: thread. El método sleep requiere un system_time, pero ¿cómo puedo construirlo?Cómo dormir un hilo de Boost C++

Mirando dentro bibliotecas realmente no ayuda mucho ...

Básicamente tengo un hilo dentro de la función que me pase a este tema como punto de entrada, me gustaría llamar algo así como

boost::this_thread::sleep 

o algo, ¿cómo hacer esto?

Gracias

Respuesta

83

Dependiendo de la versión de Boost:

O ...

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

boost::this_thread::sleep_for(boost::chrono::milliseconds(100)); 

O ...

#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/thread/thread.hpp> 

boost::this_thread::sleep(boost::posix_time::milliseconds(100)); 

También puede utilizar microsegundos, segundos , minutos, horas y tal vez algunos otros, no estoy seguro.

+2

Sí, gracias ... No presté atención usando this_thread pero simplemente boost :: hilo y nada funcionó :) Thansk – Andry

+2

Esto me da el siguiente error (con Xcode 5/LLVM): error: no hay conversión viable de 'boost :: posix_time :: microseconds' (alias 'subsecond_duration ') a 'const system_time' (alias 'const boost :: posix_time :: ptime') –

3

primer lugar

boost::posix_time::seconds secTime(1); 
boost::this_thread::sleep(secTime); 

segundo

boost::this_thread::sleep(boost::posix_time::milliseconds(100)); 
+0

awesome answer :) –

19

De otro post, he aprendido boost::this_thread::sleep es obsoleto para v1.5.3 Boost: http://www.boost.org/doc/libs/1_53_0/doc/html/thread/thread_management.html

su lugar, tratar

void sleep_for(const chrono::duration<Rep, Period>& rel_time); 

p. Ej.

boost::this_thread::sleep_for(boost::chrono::seconds(60)); 

O quizás tratar

void sleep_until(const chrono::time_point<Clock, Duration>& abs_time); 

que estaba usando v1.53 Boost con la función obsoleta sleep, y no periódica se estrelló el programa. Cuando cambié las llamadas a la función sleep a las llamadas a la función sleep_for, el programa dejó de bloquearse.

0

he aprendido de la manera difícil que al menos en MS Visual Studio (intentó 2013 y 2015) no es la gran diferencia entre

boost::this_thread::sleep(boost::posix_time::microseconds(SmallIterval)); 

y

boost::this_thread::sleep_for(boost::chrono::microseconds(SmallIterval)); 
or 
std::this_thread::sleep_for(std::chrono::microseconds(SmallIterval)); 

cuando el intervalo es menor que algunos bastante umbral sustancial (vi un umbral de 15000 microsegundos = 15 milisegundos).

Si SmallIterval es pequeño, sleep() tiene una interrupción instantánea. dormir (100 mks) se comporta como dormir (0 mks).

Pero sleep_for() para el intervalo de tiempo inferior a un umbral se detiene para todo el umbral. sleep_for (100 mks) se comporta como sleep_for (15000 mks).

Comportamiento para intervalos mayores que el umbral y para el valor 0 es el mismo.