2

我正在考虑编写这段代码:

emit finished();
deleteLater();

但这让我想知道是否finished()总是在对象被删除之前交付。我很确定它会交付给Qt::DirectConnection,但我不确定Qt::QueuedConnection,或者插槽是否在另一个线程中。

4

1 回答 1

2

当你发出一个信号时,它会被放入接收对象的线程的事件队列中进行处理。调用 deleteLater 还会将一个事件添加到队列中,因此如果接收对象和被删除对象具有相同的线程亲和性,则无论线程类型如何,它们都会顺序执行。

如果发送者和接收者具有不同的线程亲和性(在不同的线程中运行),那么我希望如果接收者的事件循环在发送者的事件循环之前开始处理,则可以在发射完成之前调用 deleteLater。

如果你想保证finished首先被执行,你可以用阻塞连接连接发送者和接收者,这将停止发送者的线程,直到消息被传递。

connect(sender, SIGNAL(finished()), receiver, SLOT(handleFinished(), Qt::BlockingQueuedConnection);

请注意,如果使用 Qt::BlockingQueuedConnection 并且发送方和接收方具有相同的线程亲和性,则应用程序将死锁。

于 2013-11-08T16:17:39.557 回答