使用boost :: asio :: deadline_timer每个线程不起作用

时间:2018-04-25 11:17:14

标签: c++ boost timer boost-asio

我是新手,所以如果我有任何错误,请告诉我。

问题是我有两个进程,我希望它们同时执行,因为它们需要花费太多时间。所以我想实现一个类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 从不动作2

我一直在寻找如何在postthis example of boost中正确实施计时器,但我仍然不明白我做错了什么。

提前致谢

0 个答案:

没有答案