在单独的线程上删除qt类后ASSERT失败

ASSERT failure after deleting my qt class on seprate thread

本文关键字:qt 类后 ASSERT 失败 删除 单独 线程      更新时间:2023-10-16

如果我有一个继承QObject的类FunctionsClass,并且其中有QTcpServerQTcpClient作为成员变量。在我的主UI类,我设置FunctionsClass成员变量在Qthread称为FunctionClassThread做:

FunctionsClass *classObj = new FunctionsClass // (classObj is a class member)
classObj->moveToThread( &FunctionClassThread );
FunctionClassThread.start();
// connected some signal/slots..
// do some stuff...

然后我解构了包含FunctionsClass实例的对象:

FunctionClassThread.quit();
FunctionClassThread.wait();
delete classObj; // problem line...........

此错误仅发生在classObj's QTcpServer当前正在侦听或其QTcpSocket正试图连接到服务器并且我删除classObj时。错误是:QCoreApplication::sendEvent: "不能将事件发送到由不同线程拥有的对象。"什么好主意吗?

classObj移动到另一个线程后,您不能再从创建它的线程中删除它。您要么必须在FunctionsClassThread中删除它,要么通过在FunctionsClassThread中处理的代码将其移回主线程。

阅读Qt文档中的moveToThread():

这个函数只能将对象从当前线程"推"到另一个线程,它不能从任意线程"拉"对象到当前线程。

所以在你的FunctionsClassThread即将停止之前,它必须调用

classObj->moveToThread( QApplication::thread() );

当然,你的FunctionsClassThread需要知道对象,要么直接,要么通过使用信号&槽

A QObject具有线程亲和性。它只喜欢在创建它的线程中被操纵。使用QMetaObject::invokeMethod在另一个线程的上下文中调用方法