Qt5 中存在哪些同步原语可以让我在单个线程中等待信号到达?

Posted

技术标签:

【中文标题】Qt5 中存在哪些同步原语可以让我在单个线程中等待信号到达?【英文标题】:What synchronization primitives exist in Qt5 that would allow me to wait for a signal to arrive in a single thread? 【发布时间】:2014-08-01 10:57:57 【问题描述】:

在我的应用程序中,我需要在信号到达之前阻止执行(等待网络请求完成)。这发生在非 gui 线程中。

查看 Qt 5.3 文档中的blocking fortune client example,它似乎使用了waitForConnected() 特定于QTcpSocket 类的方法,但我使用的是QNetworkAccessManager,它根本没有等待方法。

我还阅读了elsewhere,要做到这一点,可能需要创建一个临时的QEventLoop,它会一直阻塞直到事件完成。这个解决方案带有一堆警告,不应该在“生产代码”中使用它,因为在极端情况等情况下可能会出现各种潜在问题。

所以。男人该怎么办?

我可以在不引入第二个线程的情况下以某种方式使用 QWaitCondition 进行这项工作吗? Qt5 中有哪些同步原语可以让我在单个线程中等待信号到达?

谢谢!

【问题讨论】:

Qt 被设计成异步的,这意味着你不应该阻塞,除非在一些不寻常的情况下(例如单元测试)。如果你可以描述你想要实现的目标,也许有人可以建议一种方法来完成它而不会阻塞。 这样回答了这个问题,除了启动一个临时事件循环之外,Qt 中没有用于阻塞信号的原语。 要不要把它作为一个答案,这样我们才能把这个线程从它的痛苦中解救出来? 【参考方案1】:

Qt 被设计成asynchronous,这意味着你不应该阻塞,除非在一些不寻常的情况下(例如单元测试)。

如果你能描述你想要达到的目标,也许有人可以建议一种方法来实现它而不会阻塞。

【讨论】:

不幸的是,我的案例与访问易碎硬件有关,所以没有任何办法解决这个问题

以上是关于Qt5 中存在哪些同步原语可以让我在单个线程中等待信号到达?的主要内容,如果未能解决你的问题,请参考以下文章

Qt5:如何在线程中等待信号?

C#里有哪些线程同步的办法

python多线程编程—同步原语入门(锁Lock信号量(Bounded)Semaphore)

事件对象

如何在 C# 中等待单个事件,带有超时和取消

无需等待的并发代码