文章目录

  • QThread的使用方式
  • QThread的退出方式
  • QThread安全退出
    • 安全的退出方式
      • 线程创建以及退出示例

QThread的使用方式

在Qt中,使用QThread实现子线程的方式有两种:

  • 继承QThread,重写run函数
  • 继承QObject,使用moveToThread方式移动进QThread

QThread的退出方式

  • QThread::terminate() - 不安全
    官方说明
    终止线程的执行。线程可以立即终止,也可以不立即终止,这取决于操作系统的调度策略。请在terminate()之后使用QThread::wait()。
    当线程终止时,所有等待该线程完成的线程将被唤醒。
    警告:此函数是危险的,不鼓励使用。线程可以在其代码路径中的任何点终止。线程可以在修改数据时终止。线程没有机会自己清理,解锁任何持有的互斥锁等。简而言之,只有在绝对必要时才使用这个函数。
    终止可以通过调用QThread::setTerminationEnabled()显式地启用或禁用。在终止被禁用时调用此函数将导致延迟终止,直到重新启用终止。有关更多信息,请参阅QThread::setTerminationEnabled()的文档。
    我非常不建议大家使用这个函数,一旦使用这个函数,将会对我们的程序造成隐患,这在大型工程中是致命性的

  • QThread::exit(int returnCode = 0) - 正确使用才安全
    官方说明
    用返回代码告诉线程的事件循环退出。
    调用此函数后,线程离开事件循环并从QEventLoop::exec()调用中返回。函数的作用是:返回returnCode。
    按照惯例,returnCode为0表示成功,任何非零值表示错误。
    注意,与同名的C库函数不同,这个函数确实返回给调用者——停止的是事件处理。
    在QThread::exec()被再次调用之前,QEventLoops将不会在这个线程中启动。如果QThread::exec()中的eventloop没有运行,那么下一次调用QThread::exec()也会立即返回

  • QThread::quit - 正确使用才安全
    官方说明
    告诉线程的事件循环退出,返回代码为0(成功)。相当于调用QThread::exit(0)。
    如果线程没有事件循环,则此函数不执行任何操作。

关于Qt事件循环的文章https://zhuanlan.zhihu.com/p/72758194

QThread安全退出

重写run函数的方式退出,这个我们好控制。但是使用moveToThread的方式,在退出线程的时候,多数同学经常会碰到异常崩溃的情况,基本上都是报错 Destroyed while thread is still running ,说明线程还没有退出事件循环就被强制释放了资源,但是线程还在跑,访问了已经被释放的资源就造成了崩溃

例如使用了以下的代码( thread初始化方是 new QThread)释放资源

 thread->quit();delete thread;

或者使用了以下代码

 thread->terminate();delete thread;

这两段代码都是非常不安全的代码,不要使用。

安全的退出方式

使用QThread的finished信号绑定QObject的deleteLater函数实现资源自动释放,也可以绑定一个函数。退出时只需要调用quit()函数即可,如果绑定的是函数,则可以在适当的位置释放thread对象和Object对象
deleteLater函数可以查看Qt文档,这里就不做说明了

线程创建以及退出示例

  • 创建
 TestObject* object = new TestObject;QThread* thread = new QThread;object->moveToThread(thread );connect(thread,&QThread::finished,object,&TestObject::deleteLater);    // 退出后释放TestObject对象资源connect(thread,&QThread::finished,thread,&QThread::deleteLater);  // 退出后释放QThread对象资源thread->start();
  • 退出
 thread->quit();  // 也可以使用thread->exit(0);thread->wait(); // wait函数是个阻塞的接口,意思是线程必须真的退出了,才会执行wait之后的语句,否则将会一直阻塞在这里,如果在界面线程上使用,需要保证线程中代码的合理性。thread = nullptr;object = nullptr;

在适当的位置将 thread 和 object 置为nullptr,这样程序就安全了

Qt QThread安全退出相关推荐

  1. Qt QThread

    1)QThread 的l两种使用方法: 方式一: a. 子类化 QThread(不使用事件循环),创建对象,并调用start()函数. b. 重载 run 函数,run函数内有一个while或for的 ...

  2. QT Qthread中止回收

    在QT开辟一个QThrea线程时,想要中止并且回收资源,一般这样写: //退出线程 recThread->quit(); //回收资源 recThread->wait(); delete ...

  3. Qt开发登录/退出功能

    简要说明 本文主要介绍登录/退出的基本思路以及简单的代码实现,不涉及数据库相关操作 1.基本思路 使用Qt信号与槽的方式实现, 点击login界面下的登录按钮,发送try_login()信号,触发ma ...

  4. qt movetothread安全退出

    movetothread thread=new qthread this. move to thread(thread) timer. movetothread(thread)如果不写这句,那么tim ...

  5. Qt oracle消息队列,QT QThread 线程间消息队列

    QT 提供了良好的开发包:线程间也可以实现消息队列的方式 类似 windows PostThreadMessage的工作方式.同时比普通队列简单的很多. 但是需要稍微做特殊处理: 1. CMyThre ...

  6. python qthread 线程退出_线程:概念和实现

    翻译:老齐 译者注:与本文相关图书推荐:<Python大学实用教程><跟老齐学Python:轻松入门> ★ 本文将分两部分刊发. " 第一部分 Python线程允许程 ...

  7. Qt发布版本退出时错误处理“The inferior stopped because it received a signal from the operating system.”

    Qt程序在debug和release下都可以正常运行:并且发布的release也可以运行:但是在点击关闭按键的时候,MainWindow会进入到析构函数中,然后会蹦出对话框,并提示如下错误: Sign ...

  8. C++Qt开发-错误退出,退出代码2

    1.报错如下: 2.原因: 工程路径中存在中文,如上图中的"测试". 原文:https://blog.csdn.net/itworld123/article/details/834 ...

  9. QT中关于窗口全屏显示与退出全屏的实现

    近期在学习QT时遇到了很多问题这也是其中一个,个人通过在各种书籍和网络上的查阅找到了一些关于这方面的答案,希望能给大家一些帮助. 首先,在QT中对于窗口显示常用的有这么几个方法可以调用: Qt全屏显示 ...

最新文章

  1. java 查询 代码_java使用es查询的示例代码
  2. SQL Sever索引
  3. Leetcode 150. 逆波兰表达式求值 解题思路及C++实现
  4. mybatis教程--查询缓存(一级缓存二级缓存和整合ehcache)
  5. elenium使用IE浏览器的配置方法
  6. SAPSQL_IN_ITAB_ILLEGAL_OPTION dump
  7. numpy 矩阵 秩_一文读懂 NumPy 及应用
  8. 嵌入式工程师有发展前途吗?这是我看过最靠谱的回答
  9. 吴恩达神经网络和深度学习-学习笔记-23-快速搭建你的第一个系统原型,然后迭代
  10. 设计模式 AOP 面向切入编程
  11. 电源大师课笔记 1.5
  12. PRCV2018美图短视频实时分类挑战赛落幕,第一名解决方案技术解读
  13. 网易校招流程是怎样的?有哪些常见的笔试面试题?
  14. ueedit富文本编辑器的使用
  15. hibernate主键生成策略native,assigned,uuid的区别
  16. 智慧城市同城小程序 智慧城市同城标准版源码
  17. Leetcode题347、前K个高频元素(Python题解)Amazon面试题
  18. 解决下载github-production-release-asset-2e65be.s3.amazonaws.com上release文件慢的问题
  19. 小波神经网络短期负荷分析,小波神经网络的缺点
  20. 计算机处理执行最快的,如何提升电脑运行速度(简单快捷处理经验谈)

热门文章

  1. iOS申请 邓白氏编码(D-U-N-S Number)
  2. 企业如何运营公域+私域?
  3. Htc one m7 港版5.12.708.3官方RUU系统备份
  4. opencv学习 Warp Perspective
  5. 一、什么是数据结构与算法?
  6. 新零售与直销的区别是什么 哪一种更适合创业者?
  7. 你真正了解低代码么?(国内低代码平台状况分析)
  8. DNS主从服务器配置
  9. DNS服务器搭建与配置
  10. 编辑DNS服务器的主配置文件,DNS配置文件