2016-12-16 47 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