在线程中使用boost :: asio :: deadline_timer
Using boost::asio::deadline_timer inside a thread
我使用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
请注意清理(删除所有不必要的new
和delete
混乱)。另外, 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;
}
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 提升 ASIO 无法识别计时器对象
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 缓慢提升ASIO
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- C++ Boost::asio串行通信与Arduino无法写入
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 提升 Asio TCP 服务器 处理多个客户端
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 提升 ASIO - io_service 不要等待连接到线程
- 执行时使用 boost::asio::d eadline_timer 时出错
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- boost::asio data owning `ConstBufferSequence`
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 如何将boost::asio::d eadline_timer 与Qt一起使用?