Подтвердить что ты не робот

Как спать в С++ Boost Thread

Кажется невозможным спать поток, используя boost:: thread. Метод sleep требует system_time, но как его построить?

Внутри библиотеки не очень много помогает...

В принципе у меня есть поток внутри функции, которую я передаю этому потоку в качестве точки входа, я хотел бы назвать что-то вроде

 boost::this_thread::sleep

или что-то еще, как это сделать?

Спасибо

4b9b3361

Ответ 1

В зависимости от вашей версии Boost:

Либо...

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

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

Или...

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

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

Вы также можете использовать микросекунды, секунды, минуты, часы и, возможно, некоторые другие, я не уверен.

Ответ 2

Из другого сообщения я узнал, что boost::this_thread::sleep устарел для Boost v1.5.3: http://www.boost.org/doc/libs/1_53_0/doc/html/thread/thread_management.html

Вместо этого попробуйте

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

например.

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

Или попробуйте

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

Я использовал Boost v1.53 с устаревшей функцией sleep, и он апериодически разбил программу. Когда я изменил вызов функции sleep на вызовы функции sleep_for, программа перестала сбой.

Ответ 3

во-первых,

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

во-вторых,

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

Ответ 4

Я усвоил, что по крайней мере в MS Visual Studio (в 2013 и 2015 годах) существует огромная разница между

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

и

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

когда интервал меньше некоторого довольно значительного порога (я видел порог 15000 микросекунд = 15 миллисекунд).

Если SmallIterval мал, sleep() выполняет мгновенное прерывание. сон (100 мкс) ведет себя как сон (0 мкс).

Но sleep_for() для временного интервала, меньшего порога, приостанавливается для всего порога. sleep_for (100 mks) ведет себя как sleep_for (15000 mks).

Поведение для интервалов, больших порога, и для значения 0 одинаково.