2009-04-22 8 views
8

J'ai créé un fil d'amélioration en utilisant: boost :: thread thrd (& connectionThread); où connectionThread est une fonction vide simple. Cela fonctionne bien, cependant, lorsque je tente de le faire attendre pendant quelques secondes, par exemple en utilisant:C++ Laisser un thread d'accélération attendre 1 seconde

boost::xtime xt; 

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

xt.sec += 1; 

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

Le programme se bloque sur la ligne de xtime_get. Même en essayant manuellement de configurer xt.sec, cela ne fonctionne pas. J'ai essayé plusieurs autres méthodes, mais je n'arrive pas à le faire fonctionner. Y a-t-il quelque chose que je fais de mal? Existe-t-il un moyen plus facile d'atteindre mon objectif?

+2

Plus informat ion nécessaire - cela se bloque sur la ligne xtime_get? Si oui, comment cela plante-t-il lorsque vous définissez manuellement le xt (ou ne se comporte-t-il pas comme vous le souhaitez)? –

+0

En quoi cela ne fonctionne-t-il pas lorsque vous essayez de définir manuellement xt.sec? xt.sec = 1 est probablement une durée incroyablement courte car je pense que sec est au moins en millisecondes. Si c'est le cas, vous dormirez pendant une milliseconde. – Skurmedel

+3

http://www.boost.org/doc/libs/1_38_0/doc/html/thread/time.html#thread.time.system_time Il semble également que la version la plus récente de la bibliothèque utilise désormais des composants de boost: date_time pour spécifier la durée. – Skurmedel

Répondre

0

Avec ce code (ne sachant pas, par exemple, où vous l'avez mis), tout ce que je peux dire, c'est que la méthode xtime_get retourne le type de la mesure retournée. Autrement dit, vous devez être sûr, par exemple, que l'assertion suivante est vérifiée:

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

Il peut arriver que dans votre système ce n'est pas le cas. Cependant, en regardant à nouveau le code, il me vient à l'esprit que le crash peut ne pas être lié à cet appel en particulier, mais avec d'autres choses que vous faites dans votre application. Encore une fois, cela dépend de l'endroit où vous utilisez ce code. Est-ce dans le operator() de votre discussion?

2

boost::xtime_get() ressemble à l'une des rares API Boost qui n'est pas implémentée dans un en-tête, ce qui pourrait être quelque chose comme si la bibliothèque Boost n'était pas compilée correctement. C'est probablement quelque chose ayant des conventions d'appel incompatibles ou quelque chose. Je ne sais pas exactement ce que vous devrez faire pour reconstruire la bibliothèque - tout ce que j'ai utilisé dans Boost, ce sont des choses qui ne nécessitent que les en-têtes.

Il peut être utile de suivre la trace dans la routine xtime_get(), même si c'est au niveau de l'assemblage. La struct xtime est très, très basique et xtime_get() ne fait rien d'autre que d'appeler une API spécifique à la plate-forme pour obtenir les numéros à brancher dans la struct xtime.

26

est-il un moyen plus facile

Peut-être que quelque chose le long de ces lignes:

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

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

+1

votre deuxième moyen (ce que j'ai essayé en premier) ne fonctionne pas ... le premier est bien – MiniScalope

Questions connexes