在单独的线程上删除qt类后ASSERT失败
ASSERT failure after deleting my qt class on seprate thread
如果我有一个继承QObject
的类FunctionsClass
,并且其中有QTcpServer
和QTcpClient
作为成员变量。在我的主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在另一个线程的上下文中调用方法
相关文章:
- 调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
- 作为指针注入类后重新创建堆栈对象不好吗?
- C ++基础私有方法在将自身转换为派生类后可以访问吗?
- 通过基类引用派生类后打印的错误值
- 使用运算符和类后方法名称
- 添加qt-libs后出现编译错误
- 将 QMutex 添加到类后的"Attempting to reference a deleted function"
- 如何使用Qt类编译rpcgen文件?
- 如何声明从 QApplication 派生的 Qt 类并覆盖通知函数?
- 为什么 qt-creator 在我用小写字母命名小部件类后无法构建?
- 如何在将新的 subky 添加到 HKEY_LOCAL_MACHINE\软件\类 后更新HKEY_CLASSES_R
- 如何使用QT类和功能构建XML文件,并逃脱所有非单数字符
- 从 Qt 类派生的用户定义类中的内存所有权
- 删除派生类后,基本内存仍可访问
- 解决QT类的特定C 钻石问题
- 如何将Qt类中声明的结构传递给同一类的函数?
- 即使在定义类后也无法在C++中声明全局变量?
- 按Qt类的getter中的值返回
- 包装修改后的Qt类
- 在单独的线程上删除qt类后ASSERT失败