我在asio
快速申请中使用Qt
(仅限独立标头)。
如果我理解正确,Qt和asio都有自己的事件循环,我使用QTimer
信号来调用包含asio::io_service
对象的类。
QTimer *timer_io = new QTimer();
QObject::connect(timer_io, SIGNAL(timeout()), &my_INandOUT, SLOT(poll_ios()));
timer_io->start(IO_TIMER);
我已将IO_TIMER设置为100毫秒。我在文档中读到每个asio::io_service.reset()
后必须调用poll()
。因此,插槽poll_ios()
具有以下代码:
void INandOUT::poll_ios()
{
// qDebug() << "poll_io signal";
m_io_service.poll_one();
m_io_service.reset();
}
这是调用reset()
的正确方法吗?或者我应该在每个处理程序完成任务后调用它吗?它是安全还是我可以放松asio
事件?
答案 0 :(得分:0)
丢失asio
事件并使用Qt
内置类会更简单,更容易:例如:QNetworkAccessManager或QUdpSocket。
但是,从计时器调用poll_one
或poll
(正如您所做的那样)是将asio
与外部事件循环一起使用的常规方法。
但我不建议在调用poll_one
后调用reset,因为根据文档只应调用它:
当前一次调用这些函数时由于返回 io_service被停止或停止工作
如果重新启用asio处理程序(例如,在收到消息后启用接收处理程序),则io_service
始终有工作要做。在这种情况下,最好只拨打poll
而不是poll_one
,并且不会调用reset
,例如:
void INandOUT::poll_ios()
{
// qDebug() << "poll io signal";
m_io_service.poll();
}