我使用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循环。
答案 0 :(得分:2)
只需在单独的线程上运行io_service即可。请务必在此之前发布工作(如async_wait
),否则run()将立即返回。
<强> Live On Coliru 强>
请注意清理(删除所有不必要的new
和delete
混乱)。此外,此是您创建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;
}