繁体   English   中英

Qt:使用QEventLoop等待信号,如果信号发得太早怎么办?

[英]Qt: Waiting for a signal using QEventLoop, what if the signal is emitted too early?

我正在开发一个小型客户端 - 服务器应用程序。 客户端发送查询并且必须等待答复。 我认为最方便的方法是使用QEventLoop:

connect(&parser, SIGNAL(answer_received()), this, SLOT(react_to_answer()));
...
...
QEventLoop loop;
connect(&parser, SIGNAL(answer_received()), &loop, SLOT(quit()));
this.sendQuery();
loop.exec();

这对我来说当前answer_received() ,但是如果answer_received()速度非常快,甚至在loop.exec()之前会loop.exec()什么呢? 我的应用程序会永远停留在QEventLoop中吗?

谢谢!

鉴于你的代码,你会遇到的一个问题是,如果唯一的办法answer_received()信号发出之前loop.exec()被调用。 这相当于说, answer_received()调用过程中发出this.sendQuery();

在您的情况下,它不太可能发生,因为您依赖于服务器/客户端交互,并且您可能使用某种QNetworkAccessManagerQSocket 如果是这种情况,QNetworkAccessManager / QSocket将不会发出readyRead()finished()信号,直到您进入事件循环。

然而,如果一个更一般的情况下answer_received()可以从发射this.sendQuery()你必须改变你的代码:

  1. 您可以使它们之间的连接排队。 这种方式即使在answer_received()期间发出this.sendQuery()在您进入事件循环之前也不会调用插槽。

     connect(&parser, SIGNAL(answer_received()), &loop, SLOT(quit()), Qt::QueuedConnection); 
  2. 您可以确保在answer_received()期间永远不会发出this.sendQuery() 在这样做的方法是使用0ms QTimer,它将在事件队列中的所有事件处理后立即触发,即在loop.exec()期间

    更换:

     emit answer_received(); 

    通过:

     QTimer::singleShot(0, this, *receiver, &MyClass::answer_received); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM