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

时间:2011-11-21 03:13:03

标签: c++ multithreading qt assert delete-operator

如果我的班级FunctionsClass继承QObject并且其中包含QTcpServerQTcpClient作为成员变量。在我的主要UI类中,我通过以下操作在名为FunctionsClass的{​​{1}}上设置了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时发生。错误是:QCoreApplication :: sendEvent中的ASSERT失败:“无法将事件发送到不同线程拥有的对象。  有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

中处理

阅读moveToThread()上的Qt文档:

  

此功能只能"推送"从当前线程到的对象   另一个线程,它不能"拉"来自任意线程的对象   到当前的线程。

因此,在您的FunctionsClassThread即将停止之前,它必须调用

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

当然,您的FunctionsClassThread需要直接了解该对象,或者使用信号&槽

答案 1 :(得分:0)

QObject 具有线程关联性。它只喜欢从它创建的线程中进行操作。使用QMetaObject::invokeMethod在另一个线程的上下文中调用方法