2009-04-22 16 views
8

He creado un hilo de refuerzo usando: boost :: thread thrd (& connectionThread); donde connectionThread es una función vacía simple. Esto funciona bien, sin embargo, cuando trato de hacerlo esperar algunos segundos, por ejemplo usando:C++ Dejar que un hilo de refuerzo espere 1 segundo

boost::xtime xt; 

boost::xtime_get(&xt, boost::TIME_UTC); 

xt.sec += 1; 

boost::thread::sleep(xt); // Sleep for 1 second 

El programa se bloquea en la línea de xtime_get. Incluso cuando intentas configurar xt.sec manualmente, no funciona. He intentado varios otros métodos, pero parece que no puedo hacer que funcione. ¿Hay algo que estoy haciendo mal? ¿Hay alguna manera más fácil de lograr mi objetivo?

+2

Más inf ¿Necesito ion? ¿Esto se bloquea en la línea xtime_get? Si es así, ¿cómo se bloquea cuando configura manualmente el xt (o simplemente no se comporta como lo desea)? –

+0

¿De qué manera no funciona al intentar establecer xt.sec manualmente? xt.sec = 1 es probablemente una cantidad de tiempo increíblemente corta, ya que creo que sec es al menos en milisegundos. Si es así, dormirías durante un milisegundo. – Skurmedel

+3

http://www.boost.org/doc/libs/1_38_0/doc/html/thread/time.html#thread.time.system_time, también parece que la versión más reciente de la biblioteca ahora usa componentes de boost :: date_time para especificar la duración. – Skurmedel

Respuesta

0

Con ese código (sin saber, por ejemplo, dónde lo pones), todo lo que puedo decir es que el método xtime_get devuelve el tipo de medida devuelto. Es decir, usted tiene que estar seguro, por ejemplo, que la siguiente aserción sostiene:

int res = boost::xtime_get(&xt, boost::TIME_UTC); 
assert(res == boost::TIME_UTC); 

Puede suceder que en su sistema este no es el caso.

Sin embargo, mirando el código de nuevo, me viene a la mente que el bloqueo puede no estar relacionado con esta llamada en particular, sino con otras cosas que está haciendo en su aplicación. De nuevo, depende de dónde estés usando este código. ¿Está dentro del operator() de su hilo?

2

boost::xtime_get() parece una de las pocas API de Boost que no está implementada en un encabezado, por lo que podría ser algo así como no tener la biblioteca de Boost compilada correctamente. Esto es probablemente similar a tener convenciones de llamadas no coincidentes o algo así. No sé por qué tengo que pasar para reconstruir la biblioteca: todo lo que he usado en Boost ha sido algo que solo requiere los encabezados.

Puede ser útil si solo rastrea en la rutina xtime_get(), incluso si está en el nivel de ensamblaje. La estructura xtime es muy, muy básica y xtime_get() realmente no hace nada más que llamar a una API específica de la plataforma para obtener los números para conectarse a la estructura xtime.

26

¿Existe una manera más fácil

Tal vez algo en este sentido:

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

boost::thread::sleep(boost::posix_time::seconds(1)); 

+1

tu segunda forma (lo que he intentado primero) no funciona ... el primero está bien – MiniScalope

Cuestiones relacionadas