【问题标题】:QTimer with asio::io_service.poll_one() or poll()带有 asio::io_service.poll_one() 或 poll() 的 QTimer
【发布时间】:2016-12-19 16:22:08
【问题描述】:

我在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 毫秒。我在文档中读到必须在每个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 事件吗?

【问题讨论】:

    标签: c++ qt boost-asio qtquick2


    【解决方案1】:

    丢失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();
    }
    

    【讨论】:

    • 我对@9​​87654335@ 做的第一件事是async_connect,如果我不使用m_io_service.reset(),我的处理程序永远不会返回。谢谢,我会看看 QNetworkAccessManager。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2014-12-04
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多