web-dev-qa-db-fra.com

Comment dormir un thread Boost C ++

Semble impossible de dormir un thread en utilisant boost :: thread. La mise en veille de la méthode nécessite une heure système mais comment puis-je la construire?

Regarder à l'intérieur des bibliothèques n'aide pas vraiment beaucoup ...

Fondamentalement, j'ai un thread à l'intérieur de la fonction que je passe à ce thread comme point d'entrée, je voudrais appeler quelque chose comme

 boost::this_thread::sleep

ou quelque chose comme ça?

Je vous remercie

35
Andry

Selon 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 des microsecondes, des secondes, des minutes, des heures et peut-être quelques autres, je ne suis pas sûr.

87
Benjamin Lindley

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

Essayez plutôt

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 Boost v1.53 avec la fonction sleep obsolète, et le programme s'est écrasé de façon apériodique. Lorsque j'ai changé les appels à la fonction sleep en appels à la sleep_for, le programme a cessé de planter.

22
user3731622

d'abord

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

deuxièmement

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

J'ai appris à la dure qu'au moins dans MS Visual Studio (essayé en 2013 et 2015), il y a une énorme différence 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 inférieur à un seuil assez important (j'ai vu un seuil de 15 000 microsecondes = 15 millisecondes).

Si SmallIterval est petit, sleep () fait une interruption instantanée. 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 tout le seuil. 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.

0
Lenny