gpt4 book ai didi

c++ - 在线程中使用 boost::asio::deadline_timer

转载 作者:行者123 更新时间:2023-11-28 01:56:44 25 4
gpt4 key购买 nike

我使用 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() 将立即返回。

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;
}

关于c++ - 在线程中使用 boost::asio::deadline_timer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40928020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com