Использование boost :: asio :: deadline_timer для каждого потока не работает - PullRequest
0 голосов
/ 25 апреля 2018

Я новичок здесь, так что если у меня будут какие-либо ошибки, просто скажите мне.

Проблема в том, что у меня есть два процесса, и я хочу, чтобы они выполнялись одновременно, потому что они занимают слишком много времени. Поэтому я решил реализовать класс timer, который управляет собственным boost::asio::io_service и создать поток для этого io_service. Код следующий:

timer.hpp

#include <iostream>
#include <string>
#include <functional>
#include <thread>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>

class timer
{
public:
    timer(std::function<void(void)> task,
          int time)
    : io__(),
      timer__(io__, boost::posix_time::milliseconds(time)),
      repetitive_task__(task),
      time_wait__(time)
    {
          timer__.async_wait(boost::bind(&timer::loop, this));
    }

    void start()
    {
        thread__ = std::thread([this](){ 
            io__.run(); 
        });
        thread__.join();
    }

    void loop()
    {
        repetitive_task__();
        timer__.expires_at(timer__.expires_at() + boost::posix_time::milliseconds(time_wait__));
        timer__.async_wait(boost::bind(&timer::loop, this));
    }

    void stop()
    {
        timer__.cancel();
        io__.stop();
    }

private:
    boost::asio::io_service io__;
    boost::asio::deadline_timer timer__;
    std::function<void(void)> repetitive_task__;
    int time_wait__;
    std::thread thread__;
};

Для тестирования у меня есть самое простое из основных, что я мог подумать:

main.cpp

#include "timer.hpp"

void test1()
{
    printf("action1 \n");
}

void test2()
{
    printf("action 2 \n");
}

int main(int argc, char* argv[])
{
    timer timer1(&test1, 100);
    timer timer2(&test2, 50);

    timer1.start();
    timer2.start();
    return 0;
}

И результат всегда action1 . Никогда action2 .

Я искал, как правильно реализовать таймеры, как в этом посте или в этом примере повышения , но я все еще не понимаю, что я делаю неправильно.

Заранее спасибо

...