如果我的班级FunctionsClass
继承QObject
并且其中包含QTcpServer
和QTcpClient
作为成员变量。在我的主要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失败:“无法将事件发送到不同线程拥有的对象。
有什么想法吗?
答案 0 :(得分:2)
将classObj
移动到另一个线程后,您不能再从您创建它的线程中删除它。您必须在FunctionsClassThread
中删除它或通过它移回主线程代码,在FunctionsClassThread
。
阅读moveToThread()上的Qt文档:
此功能只能"推送"从当前线程到的对象 另一个线程,它不能"拉"来自任意线程的对象 到当前的线程。
因此,在您的FunctionsClassThread即将停止之前,它必须调用
classObj->moveToThread( QApplication::thread() );
当然,您的FunctionsClassThread需要直接了解该对象,或者使用信号&槽
答案 1 :(得分:0)
QObject 具有线程关联性。它只喜欢从它创建的线程中进行操作。使用QMetaObject::invokeMethod在另一个线程的上下文中调用方法