2009-04-22 20 views
8

Ho creato un thread di boost utilizzando: boost :: thread thrd (& connectionThread); dove connectionThread è una semplice funzione void. Questo funziona bene, tuttavia, quando provo a farlo attendere alcuni secondi, ad esempio utilizzando:C++ Lasciando un thread di boost attendere 1 secondo

boost::xtime xt; 

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

xt.sec += 1; 

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

Il programma si blocca alla linea xtime_get. Anche quando provi manualmente a impostare xt.sec, non funziona. Ho provato diversi altri metodi, ma non riesco a farlo funzionare. C'è qualcosa che sto sbagliando? C'è un modo più semplice per raggiungere il mio obiettivo?

+2

Altro informat necessario ion - questo si blocca sulla linea xtime_get? In caso affermativo, come si arresta in modo anomalo quando si imposta manualmente xt (o semplicemente non si comporta come si desidera)? –

+0

In che modo non funziona quando si tenta di impostare manualmente xt.sec? xt.sec = 1 è probabilmente una quantità incredibilmente breve di tempo perché penso che sec sia almeno in millisecondi. Se è così, dormirai per un millisecondo. – Skurmedel

+3

http://www.boost.org/doc/libs/1_38_0/doc/html/thread/time.html#thread.time.system_time sembra anche che la versione più recente della libreria ora utilizzi i componenti di boost :: date_time per specificare la durata. – Skurmedel

risposta

0

Con quel codice (non sapendo, ad esempio, dove lo si inserisce), tutto quello che posso dire è che il metodo xtime_get restituisce il tipo di misura restituita. Cioè, si deve essere sicuri, ad esempio, che la seguente asserzione vale:

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

Può accadere che nel vostro sistema non è questo il caso.

Tuttavia, guardando nuovamente il codice, mi viene in mente che il crash potrebbe non essere correlato a questa chiamata in particolare, ma con altre cose che stai facendo nella tua applicazione. Di nuovo, dipende da dove stai usando questo codice. È all'interno dello operator() della tua discussione?

2

boost::xtime_get() si presenta come una delle poche API Boost non implementate in un'intestazione, quindi potrebbe essere qualcosa come non avere la libreria Boost compilata correttamente. Probabilmente questo è un po 'sbagliato quando si chiamano le convenzioni o qualcosa del genere. Non so in cima alla mia testa quali passi potrebbe essere necessario passare per ricostruire la libreria - tutto ciò che ho mai usato in Boost è stato roba che richiede solo le intestazioni.

Potrebbe essere utile se si traccia solo nella routine xtime_get(), anche se è a livello di assembly. La struttura xtime è molto, molto di base e xtime_get() non fa nulla di più che chiamare un'API specifica per piattaforma per ottenere i numeri da collegare alla struttura xtime.

26

C'è un modo più semplice

Forse qualcosa in queste righe:

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

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

+1

il tuo secondo modo (quello che ho provato prima) non funziona ... il primo va bene – MiniScalope

Problemi correlati