使用asio :: io_service.poll_one()或poll()的QTimer

时间:2016-12-16 14:55:09

标签: c++ qt boost-asio qtquick2

我在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事件?

1 个答案:

答案 0 :(得分:0)

丢失asio事件并使用Qt内置类会更简单,更容易:例如:QNetworkAccessManagerQUdpSocket

但是,从计时器调用poll_onepoll(正如您所做的那样)是将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();
}