Как получить функциональность таймера с помощью boost в С++?

Мое приложение представляет собой многопоточное приложение, в котором я создаю поток, который продолжает читать данные в сокете, чтобы постоянно проверять уведомления с сервера, а другой поток отправляет запросы на сервер после каждого времени t (скажем, 20 секунд). Я использую boost для того же. Я прочитал о boost:: asio и нашел функцию таймера dead_timer(). Но, насколько я понимаю, она срабатывает только один раз асинхронно, но мое требование - непрерывные вызовы для отправки каждый раз, когда истекает время таймера t. Как мне это реализовать? Заранее спасибо.


person harry    schedule 09.02.2016    source источник
comment
Взгляните на образцы asio   -  person sehe    schedule 09.02.2016
comment
@sehe: я посмотрел на это. Поправьте меня, если я ошибаюсь в понимании. Я понимаю, что он может срабатывать только после истечения времени таймера, но что, если мне нужно продолжать вызывать функцию каждые t интервалов времени?   -  person harry    schedule 09.02.2016
comment
Это классическая проблема с потоками. Вы должны прочитать о <thread>, Boost.Thread или pthreads.   -  person erip    schedule 09.02.2016
comment
@erip: я понимаю, что уже использую много потоков, использующих boost в своем приложении, даже это присутствует в отдельном потоке.   -  person harry    schedule 09.02.2016


Ответы (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
comment
Но где моя функция будет находиться в вашем коде? Где я буду вызывать свою функцию? - person harry; 09.02.2016
comment
Вы бы назвали это везде, где это было бы уместно. В приведенном выше примере я просто хотел проиллюстрировать, как перезапустить таймер. Если вы не знаете, где вам нужен таймер, это отдельный (и выходящий за рамки) вопрос. - person Chad; 09.02.2016
comment
Понятно !! Мой вопрос касался вызова, поскольку ранее я использовал 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
comment
Другой ответ - лучший подход, обычно - person sehe; 09.02.2016