Мое приложение представляет собой многопоточное приложение, в котором я создаю поток, который продолжает читать данные в сокете, чтобы постоянно проверять уведомления с сервера, а другой поток отправляет запросы на сервер после каждого времени t (скажем, 20 секунд). Я использую boost для того же. Я прочитал о boost:: asio и нашел функцию таймера dead_timer(). Но, насколько я понимаю, она срабатывает только один раз асинхронно, но мое требование - непрерывные вызовы для отправки каждый раз, когда истекает время таймера t. Как мне это реализовать? Заранее спасибо.
Как получить функциональность таймера с помощью boost в С++?
Ответы (2)
Вы можете просто снова запустить таймер из его обработчика:
#include <iostream>
#include <boost/asio.hpp>
using namespace std;
int stop_after = 3;
void async_wait_timer(boost::asio::deadline_timer& t, int seconds)
{
t.expires_from_now(boost::posix_time::seconds{1});
t.async_wait(
[&] (const boost::system::error_code& e)
{
--stop_after;
if(!e || !stop_after)
{
async_wait_timer(t, seconds);
}
});
}
int main()
{
boost::asio::io_service svc;
boost::asio::deadline_timer timer{svc};
async_wait_timer(timer, 1);
svc.run();
return 0;
}
person
Chad
schedule
09.02.2016
Но где моя функция будет находиться в вашем коде? Где я буду вызывать свою функцию?
- person harry; 09.02.2016
Вы бы назвали это везде, где это было бы уместно. В приведенном выше примере я просто хотел проиллюстрировать, как перезапустить таймер. Если вы не знаете, где вам нужен таймер, это отдельный (и выходящий за рамки) вопрос.
- person Chad; 09.02.2016
Понятно !! Мой вопрос касался вызова, поскольку ранее я использовал t.async_wait(func) для запуска своей функции, но в вашем примере кода вы используете t.async_wait() для повторного запуска таймера, но если это так, мне нужно изменить свою логику. в любом случае спасибо за ваш быстрый ответ. Ваше здоровье!!
- person harry; 09.02.2016
Решите требование, поместив в него непрерывный цикл с date_timer, пока моя система не выключится.
while(!shutdown==true)
{
boost::asio::io_service io;
boost::asio::deadline_timer timer(io, boost::posix_time::seconds(10)); timer.async_wait(&check_faults);
io.run();
}
Если кто-то может предложить лучший подход, напишите свой комментарий, я был бы очень признателен.
person
harry
schedule
09.02.2016
Другой ответ - лучший подход, обычно
- person sehe; 09.02.2016
<thread>
, Boost.Thread или pthreads. - person erip   schedule 09.02.2016