qt阻塞连接死锁

时间:2013-05-24 02:01:32

标签: multithreading qt

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

来自Qt Docs

  

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

如何确定发射器和接收器何时处于不同的线程中。我对此有一些模糊的想法,因为我的应用程序出现问题,直到我添加了Qt::BlockingQueuedConnection标志。但是知道我的应用程序不想关闭。它坚持工作线程。

更新

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

如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

通常,您只需知道您创建对象的位置以及是否使用QObject::moveToThread。如果要以编程方式检查它,可以执行以下操作:

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

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