QTimer with asio::io_service.poll_one() or poll()

QTimer with asio::io_service.poll_one() or poll()

本文关键字:poll with or asio one service io QTimer      更新时间:2023-10-16

我在Qt快速应用程序中使用asio(仅独立标题)。

作为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。我已经在文档中读到,每个poll()之后必须调用asio::io_service.reset()。因此,插槽poll_ios()具有以下代码:

void INandOUT::poll_ios()
{
    //    qDebug() << "poll_io signal";
    m_io_service.poll_one();
    m_io_service.reset();
}

这是调用reset()的正确方法吗?还是完成任务后我应该在每个处理程序中称其为?它是安全的还是我可以失去asio事件?

丢失asio事件并使用Qt内置类要简单,更容易。

但是,从计时器调用poll_onepoll(如您所做的那样)是将asio与外部事件循环一起使用的正常方法。

,但我不建议在致电poll_one后打电话重置,因为根据文档,它只能称为:

当这些功能的先前调用返回时 io_service被停止或用完工作

如果您可以重新启用ASIO处理程序(例如,在接收消息后启用接收处理程序),则io_service总是有工作要做。在这种情况下,最好只致电poll而不是poll_one,然后丢失reset的呼叫,例如:

void INandOUT::poll_ios()
{
    // qDebug() << "poll io signal";
    m_io_service.poll();
}