![](/img/trans.png)
[英]Qt: QSslSocket::bytesWritten() signal is emitted too often
[英]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();
。
在您的情况下,它不太可能发生,因为您依赖于服务器/客户端交互,并且您可能使用某种QNetworkAccessManager
或QSocket
。 如果是这种情况,QNetworkAccessManager / QSocket将不会发出readyRead()
或finished()
信号,直到您进入事件循环。
然而,如果一个更一般的情况下answer_received()
可以从发射this.sendQuery()
你必须改变你的代码:
您可以使它们之间的连接排队。 这种方式即使在answer_received()
期间发出this.sendQuery()
在您进入事件循环之前也不会调用插槽。
connect(&parser, SIGNAL(answer_received()), &loop, SLOT(quit()), Qt::QueuedConnection);
您可以确保在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.