2011-11-21 18 views
1

如果我有一个类FunctionsClass,它继承QObject并且其中的QTcpServerQTcpClient作为成员变量。在我的主UI类我成立了一个名为FunctionClassThreadQthreadFunctionsClass成员变量做:在分离线程上删除我的qt类后,ASSERT失败

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'sQTcpServer当前正在侦听或其QTcpSocket正试图连接到服务器,并删除classObj时发生。错误是:在QCoreApplication ::的SendEvent ASSERT失败:?“无法发送事件由不同的线程拥有的对象 任何想法

回答

2

的情况下移动classObj到另一个线程后,可以不再允许您在创建它的线程删除它。你要么必须在您FunctionsClassThread或删除通过在FunctionsClassThread内处理的代码将其移回主线程。

阅读moveToThread() Qt的文档:

此功能只能“推”从当前线程的对象 另一个线程,它不能从任何任意线程 “拉”的对象到当前的线。

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

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

当然你FunctionsClassThread需要注意的对象,无论是直接或通过信号&插槽

0

一个的QObject具有线程关联,只喜欢被从线程操纵它。在已创建。使用QMetaObject::invokeMethod调用方法在另一个线程

+0

我不会将父项传递给FunctionsClass,因此如何知道它是在主UI线程中创建的? – TheFuzz