2016-12-16 21 views
1

我在Qt快速应用程序中使用asio(仅限独立标题)。QTimer with asio :: io_service.poll_one()或poll()

由于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 ms。我已阅读文档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

这会更简单,更容易丢失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(); 
} 
+0

我做的第一件事'asio'是'async_connect',和我的处理程序永远不会回来如果我不使用'm_io_service.reset()'。谢谢,我会看看QNetworkAccessManager。 – jmatthieu