在线程

时间:2016-12-02 08:47:10

标签: c++ multithreading boost boost-asio

我使用boost :: asio :: deadline_timer来运行一个函数。 我有MosquitoInterface课程如下

class MosquitoInterface{

   MosquitoInterface(deadline_timer &timer) : t(timer){}

}

main.c

int main(int argc, char** argv )
{    

     io_service io;
     deadline_timer t(io);
     MosquitoInterface *m = new MosquitoInterface(t);


     io.run();

     d = new Detectdirection();      
     while(run)
     {   

        int ret =  d->Tracking();
        if(ret < 0)
           cout << "Pattern is not found" << endl ;
     }

     if(d!=NULL)    
        delete d;
     if(m!=NULL)
        delete m;
     cout << "Process Exit" << endl;
     exit(1);
}

如果我跑io.run();在while(run){ }之前,while(run){ }不起作用。 如果我在io.run()之后放while(run){ },则计时器不起作用。 因为他们是主线。

如何在一个线程中运行boost :: asio :: deadline_timer,这样就不会阻塞while循环。

1 个答案:

答案 0 :(得分:2)

只需在单独的线程上运行io_service即可。请务必在此之前发布工作(如async_wait),否则run()将立即返回。

<强> Live On Coliru

请注意清理(删除所有不必要的newdelete混乱)。此外,是您创建SSCCE的方式:

#include <boost/asio.hpp>
#include <thread>
#include <iostream>
#include <atomic>

static std::atomic_bool s_runflag(true);

struct Detectdirection {
    int Tracking() const { return rand()%10 - 1; }
};

struct MosquitoInterface{
   MosquitoInterface(boost::asio::deadline_timer &timer) : t(timer) {
       t.async_wait([](boost::system::error_code ec) { if (!ec) s_runflag = false; });
   }
   boost::asio::deadline_timer& t;
};

int main() {
    boost::asio::io_service io;
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(3));

    MosquitoInterface m(t);
    std::thread th([&]{ io.run(); });

    Detectdirection d;
    while (s_runflag) {
        if (d.Tracking()<0) {
            std::cout << "Pattern is not found" << std::endl;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }

    th.join();
    std::cout << "Process Exit" << std::endl;
}