【问题标题】:qt blocking connection deadlockqt阻塞连接死锁
【发布时间】:2013-05-24 02:01:31
【问题描述】:

在我的代码中,一个工作线程发出一个信号。

来自Qt Docs

Qt::BlockingQueuedConnection - 与 QueuedConnection 相同,除了当前线程阻塞直到槽返回。这种连接类型应该只用于发射器和接收器在不同线程中的情况。 注意: 违反此规则可能会导致您的应用程序死锁。

如何确定发射器和接收器何时在不同的线程中。我对此有一些模糊的想法,因为在我添加Qt::BlockingQueuedConnection 标志之前,我的应用程序存在问题。但知道我的应用程序不想关闭。它被工作线程卡住了。

更新:

我对问题进行了更多调查。线程被发出的信号阻塞。因为当我关闭应用程序时,插槽(在 MainWindow 中)被破坏,并且发出信号会产生这个死锁。

如何解决这个问题?

【问题讨论】:

    标签: multithreading qt


    【解决方案1】:

    通常,您只需知道您在哪里创建了对象以及是否使用了QObject::moveToThread。如果你想以编程方式检查它,你可以这样做:

    Qt::ConnectionType type = Qt::AutoConnection;
    if (sender->thread() != receiver->thread())
        type = Qt::BlockingQueuedConnection;
    

    您的程序可能不会关闭,因为您没有退出所有线程。您应该在关闭事件中为每个人致电QThread::quit

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 2014-04-04
      • 2016-01-31
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多