2010-11-24 4 views
34

Semble impossible de dormir un thread en utilisant boost :: thread. La méthode sleep nécessite un system_time mais comment puis-je le construire?Comment faire pour dormir un thread Boost C++

Vous cherchez des bibliothèques à l'intérieur ne pas vraiment aider beaucoup ...

Fondamentalement j'ai un fil dans la fonction que je passe à ce fil comme point d'entrée, je voudrais appeler quelque chose comme

boost::this_thread::sleep 

ou quelque chose, comment faire?

Merci

Répondre

83

En fonction de votre version de Boost:

... Soit

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

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

Ou ...

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

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

Vous pouvez également utiliser microsecondes, secondes , minutes, heures et peut-être quelques autres, je ne suis pas sûr.

+2

Oui, merci ... Je n'ai pas fait attention en utilisant this_thread mais juste boost :: thread et rien n'a fonctionné :) Thansk – Andry

+2

Cela me donne l'erreur suivante (en utilisant Xcode 5/LLVM): erreur: pas de conversion viable de 'boost :: posix_time :: microseconds' (alias 'subsecond_duration ') à 'const system_time' (alias 'const boost :: posix_time :: ptime') –

3

d'abord

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

d'autre part

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

super réponse :) –

19

D'un autre poste, j'ai appris boost::this_thread::sleep est dépréciée pour Boost v1.5.3: http://www.boost.org/doc/libs/1_53_0/doc/html/thread/thread_management.html

Au lieu de cela, essayez

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

par exemple.

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

Ou peut-être essayer

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

j'utilisais v1.53 Boost avec la fonction sleep dépréciée, et il est écrasé le programme apériodique. Lorsque j'ai modifié les appels à la fonction sleep pour les appels à la fonction sleep_for, le programme a arrêté de se bloquer.

0

j'ai appris à la dure au moins dans MS Visual Studio (essayé 2013 et 2015), il y a la différence énorme entre

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

et

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

lorsque l'intervalle est plus petit que certains plutôt seuil substantiel (j'ai vu le seuil de 15000 microsecondes = 15 millisecondes).

Si SmallIterval est petit, sleep() est interrompu instantanément. le sommeil (100 mks) se comporte comme le sommeil (0 mks).

Mais sleep_for() pour l'intervalle de temps inférieur à un seuil marque une pause pour le seuil entier. sleep_for (100 mks) se comporte comme sleep_for (15000 mks).

Le comportement pour les intervalles supérieurs au seuil et pour la valeur 0 est le même.

Questions connexes