在线程中使用boost :: asio :: deadline_timer

Using boost::asio::deadline_timer inside a thread

本文关键字:asio deadline timer boost 线程      更新时间:2023-10-16

我使用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循环没有阻塞。

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

活在coliru

请注意清理(删除所有不必要的newdelete混乱)。另外, this 是您创建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;
}