gpt4 book ai didi

c++ - 带有 asio::io_service.poll_one() 或 poll() 的 QTimer

转载 作者:太空宇宙 更新时间:2023-11-04 13:08:13 25 4
gpt4 key购买 nike

我在 Qt Quick 应用程序中使用 asio(仅独立 header )。

如果我理解正确的话,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 事件吗?

最佳答案

丢掉 asio 事件并使用 Qt 内置类来代替会更简单和容易:例如:QNetworkAccessManagerQUdpSocket .

但是,从计时器调用 poll_onepoll(正如您所做的那样)是使用 asio 处理外部事件的正常方式环形。

但我不建议调用reset在调用 poll_one 之后,因为根据文档,它应该只被调用:

when a previous invocation of these functions returned due to the io_service being stopped or running out of work

如果您重新启用您的 asio 处理程序(例如,在收到消息后启用接收处理程序),那么 io_service 总是有工作要做。在这种情况下,最好只调用 poll 而不是 poll_one 并丢失对 reset 的调用,例如:

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

关于c++ - 带有 asio::io_service.poll_one() 或 poll() 的 QTimer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41187024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com