【问题标题】:Is the connect() call thread safe in Qt?Qt 中的 connect() 调用线程安全吗?
【发布时间】:2014-09-26 19:42:40
【问题描述】:

我有两个QObjects AB 住在不同的QThreads。 A 将发出一个信号,而B 有一个匹配的。我想用connect()A的信号连接到B的槽。

所以问题是,connect() 调用 线程安全 吗?连接是在两个线程中的哪一个线程中进行的吗?

【问题讨论】:

    标签: qt thread-safety qt-signals


    【解决方案1】:

    是的,QObject::connect() 是线程安全的方法:

    注意:这个类中的所有函数都是可重入的,但是connect(), connect()、disconnect() 和 disconnect() 也是线程安全的。

    从哪个线程进行连接并不重要。但是您应该关心在您的对象之间使用auto connection(默认连接)、unique connectionqueued connection。你应该在你的两个线程中运行事件循环。

    另外我强烈建议您查看以下文章:firstsecond

    【讨论】:

    • 是否使用 Qt::QueuedConnection 取决于你想要什么行为。根本不需要在每个线程中运行一个事件循环,这取决于你想要什么。
    • @Martin,队列连接告诉 Qt,该信号将在插槽线程的事件循环中延迟处理。这就是为什么需要在两个线程中运行事件循环以在对象之间成功通信的原因。如果你不这样做,那么你的代码不是线程安全的,并准备在 GUI 线程事件循环中随机崩溃......同样,如果对象属于没有事件循环的线程,则发出的信号将永远不会被处理和传递插槽。有异议吗? Qt 5 中可能发生了一些变化
    • 我只阅读了 Qt5 文档,所以不能说 Qt
    • 在 Qt5 中自动连接是默认的。只有当对象在不同的​​线程上时,这种类型的连接才会排队。我通常使用 Qt::UniqueConnection,因为它与 AutoConnection 相同,只是防止多次建立相同的连接(由于错误或其他原因)。
    • 谢谢,我已经更新了答案。关于 QCoreApplication::postEvent,看起来使用这种方法无法将信号从一个线程中的对象发送到另一个线程中的对象插槽。它存在方法 QApplication::processEvents(),但实际上我认为它也不会起作用。会尝试自己弄清楚:)
    猜你喜欢
    • 1970-01-01
    • 2019-05-17
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2018-02-26
    • 2018-07-18
    • 1970-01-01
    相关资源
    最近更新 更多