Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QObject::deleteLater跨QThread_C++_Qt - Fatal编程技术网

C++ QObject::deleteLater跨QThread

C++ QObject::deleteLater跨QThread,c++,qt,C++,Qt,我正在寻找一种解决方案来计划跨线程删除对象。关于deleteLater行为的文档并不完全清楚。我可以在不是对象所有者的线程中调用此函数吗 例如,对象X属于线程A,在线程B中,我希望删除对象X。由于该对象目前可能在事件处理中(在线程A中),因此在它返回到消息循环之前,我无法安全地将其删除。如果我从线程B调用deleteLater,文档似乎表明只要线程B返回到消息循环,它就会删除 目前我采用的方法是在线程a中发出一个信号,该线程连接到一个调用deleteLater的插槽。我想知道是否有一种更简单的方

我正在寻找一种解决方案来计划跨线程删除对象。关于
deleteLater
行为的文档并不完全清楚。我可以在不是对象所有者的线程中调用此函数吗

例如,对象X属于线程A,在线程B中,我希望删除对象X。由于该对象目前可能在事件处理中(在线程A中),因此在它返回到消息循环之前,我无法安全地将其删除。如果我从线程B调用
deleteLater
,文档似乎表明只要线程B返回到消息循环,它就会删除

目前我采用的方法是在线程a中发出一个信号,该线程连接到一个调用
deleteLater
的插槽。我想知道是否有一种更简单的方法可以做到这一点——如果我真的可以从任何线程调用
deleteLater

deleteLater()
只意味着在处理完当前事件循环(即ThreadB)中的所有信号/插槽后,对象将被删除

因此,如果ThreadB中没有其他插槽需要ObjectX,那么它相当于一个普通的
delete

您是否可以删除该对象以及如何在ThreadA中处理该对象取决于您的应用程序逻辑

如果ObjectX是线程的主要对象,则将
quit()
信号发送到ThreadA是一种方法。

虽然
deleteLater()
本身并不安全,但您可以通过元调用在
对象的
ThreadA
中调用它:

metaObject()->invokeMethod(object, "deleteLater", Qt::QueuedConnection);
然后,它将是安全的。

查看和,
deleteLater()
只调用显式声明为线程安全的
QCoreApplication::postEvent()
。所以,直接打电话就可以了。在对象的所有者线程中处理事件队列时,将在线程A中进行删除


只有Qt5明确地将
deleteLater()
列为线程安全。如果您想完全依赖Qt4中记录的行为,请在Qt中使用
postEvent()

,您可以更改哪个线程拥有一个对象。这对你有帮助吗?这就是对象进入线程的方式。会有很多这样的对象,线程是一个不同的对象。您正在确认deleteLater确实只在当前线程中发生(因此对我来说不安全)。@edA-qamart-ora-y这取决于您使用的Qt版本。请参见您问题下方的
Lol4t0
注释。我担心文档中只对排队连接说了“主事件循环”(与排队连接通常的工作方式大不相同)。这仅仅是一个文档错误,这是否真的会像一个普通的信号被推到另一个线程中?@edA-qamort-ora-y,好吧,这似乎是文档错误,我确实用这样的代码删除了对象,但是在研究Qt源代码的时候,我发现直接调用
deleteLater
和元调用一样安全,因此,在当前实现中,直接调用工作和未来版本的行为在这两种情况下都可能令人惊讶。我现在也跟踪了源代码,后来它只发布了一个事件,并且跟踪发布的事件将始终发送给接收方的线程所有者。啊!为什么医生不能说同样的话,这样我就不用担心这个了…:(@edA-qamort-ora-y,以及doc什么也没说,我们可以发现,例如,qt4.9不发送事件,但smth不安全,所以要小心。我已经在qt论坛上询问过,也许那里有一位常驻专家。现在,我将坚持一种保证有效的方法,尽管我感到困惑。