文章目录

  • 1 Qt中线程的生命期问题
    • 1.1 Qt中线程的生命期问题
    • 1.2 同步型线程设计
    • 1.3 在异步型线程设计

1 Qt中线程的生命期问题

1.1 Qt中线程的生命期问题

一个工程中实际的问题:

  • C++对象有生命周期,线程也有生命周期,QThread对象的生命周期与所对应的线程生命周期是否一致?

工程实践中的经验准则:

下面的代码有问题吗?

运行结果:

1.2 同步型线程设计

概念:

  • 线程对象主动等待线程生命周期结束后才销毁。

特点:

  • 同时支持在栈和堆中创建线程对象。
  • 对象销毁时确保线程生命期结束。

要点:

  • 在析构函数中先调用wait()函数,强制等到线程运行结束。

使用场合:

  • 线程生命期相对较短的情形。

    SyncThread.h:
#ifndef SYNCTHREAD_H
#define SYNCTHREAD_H#include <QThread>class SyncThread : public QThread
{Q_OBJECTprotected:void run();public:explicit SyncThread(QObject *parent = 0);~SyncThread();
};#endif // SYNCTHREAD_H

SyncThread.cpp:

#include "SyncThread.h"
#include <QDebug>SyncThread::SyncThread(QObject *parent) :QThread(parent)
{}void SyncThread::run()
{qDebug() << "void SyncThread::run() tid = " << currentThreadId();for(int i=0; i<3; i++){qDebug() << "void SyncThread::run() i = " << i;sleep(1);}qDebug() << "void SyncThread::run() end";
}SyncThread::~SyncThread()
{wait();qDebug() << "SyncThread::~SyncThread() destroy thread object";
}

1.3 在异步型线程设计

要点:

  • 在run()中最后调用deleteLater()函数。
  • 线程体函数主动申请销毁线程对象。

使用场合:

  • 线程生命期不可控,需要长时间运行于后台的情形。


注:

  • deleteLater()只是向当前对象所依附的线程事件循环队列中加入了一个删除自己的请求。

AsyncThread.h:

#ifndef ASYNCTHREAD_H
#define ASYNCTHREAD_H#include <QThread>class AsyncThread : public QThread
{Q_OBJECTprotected:void run();explicit AsyncThread(QObject *parent = 0);~AsyncThread();public:static AsyncThread* NewInstance(QObject *parent = 0);};#endif // ASYNCTHREAD_H

AsyncThread.cpp:

#include "AsyncThread.h"
#include <QDebug>AsyncThread* AsyncThread::NewInstance(QObject *parent)
{return new AsyncThread(parent);
}AsyncThread::AsyncThread(QObject *parent) :QThread(parent)
{}void AsyncThread::run()
{qDebug() << "void AsyncThread::run() tid = " << currentThreadId();for(int i=0; i<3; i++){qDebug() << "void AsyncThread::run() i = " << i;sleep(1);}qDebug() << "void AsyncThread::run() end";deleteLater();
}AsyncThread::~AsyncThread()
{qDebug() << "AsyncThread::~AsyncThread() destroy thread object";
}

总结一下:

  • 线程对象生命期必须大于对象线程生命期。
  • 同步型线程设计-线程生命期较短。
  • 异步型线程设计-线程生命期不可控。
  • 线程类的设计必须适应具体的场合。
  • 没有万能的设计,只有合适的设计。

参考资料:

  1. QT实验分析教程

Qt中线程的生命期问题相关推荐

  1. java for(o t :object) 获取顺序号_java中线程的生命周期

    线程是java中绕不过去的一个话题, 今天本文将会详细讲解java中线程的生命周期,希望可以给大家一些启发. java中Thread的状态 java中Thread有6种状态,分别是: NEW – 新创 ...

  2. java中线程的生命周期

    文章目录 java中Thread的状态 NEW Runnable BLOCKED WAITING TIMED_WAITING TERMINATED java中线程的生命周期 线程是java中绕不过去的 ...

  3. java中线程的生命周期_Java中的线程生命周期– Java中的线程状态

    java中线程的生命周期 Understanding Thread Life Cycle in Java and Thread States are very important when you a ...

  4. Java中线程的生命周期-图解

    线程的生命周期:当一个线程被创建之后,进入新建状态,JVM则给他分配内存空间,并进行初始化操作.当线程对象调用了start()方法,该线程就处于就绪状态(可执行状态),JVM会为其创建方法调用栈.和程 ...

  5. Qt中线程的简单使用

    对于线程过去写的比较少,现在也几乎是小白的水平.先创建Qt empty project,即Qt空项目,打开QtCreate->文件->新建文件或项目->其它项目->empty ...

  6. 关于Qt中线程的挂起和唤醒问题

    为了平台的可移植性,现在好多公司或开发者都在用Qt开发,但是Qt开发文档有一个不非常理想的问题是,有些问题描述的不是太详细,特别是涉及到线程的挂起,唤醒.和sleep()等问题. 在Qt开发中,有许多 ...

  7. pthread_create函数阻塞了主线程_5个状态,Python 中线程的生命周期

    编 程 的 朝 圣 之 路 ---------------------------------------- 当程序中包含多个线程时,CPU 不是一直被特定的线程霸占,而是轮流执行各个线程. 那么,C ...

  8. Qt中线程同步的几种方法详解

    1.QMutex类 QMutex类就像一把锁,在互斥量以前上锁(QMutex::lock()),而后在使用完互斥量以后解锁(QMutex::unlock()).好比下面的代码:函数 void some ...

  9. 线程的生命周期其实没有我们想象的那么简单!!

    来自:冰河技术 写在前面 在[高并发专题]中的<高并发之--线程与多线程>一文中,我们简单介绍了线程的生命周期和线程的几个重要状态,并以代码的形式实现了线程是如何进入各个状态的.今天,我们 ...

最新文章

  1. h3c l2tp ***配置
  2. HDLBits 系列(38)值得一看的状态机设计题目
  3. ASP.NET(C#)常用数据加密和解密方法汇总
  4. VTK:图表之TreeToMutableDirectedGraph
  5. 全球 MEDC 2007 举行日期
  6. C++实现字符串的拼接
  7. Java面试常见算法
  8. LeetCode 2157. 字符串分组(状态压缩+位运算+图的遍历)
  9. 像git一样管理数据,高效的数据管理平台TensorBay来了!
  10. AspNetPager使用方法
  11. 蓝桥杯_算法训练_审美课
  12. matlab JAVA交互_如何使MATLAB绘图交互?
  13. imshow显示图像为纯白或者纯黑或者为杂点(noise)原因分析(下篇)
  14. 2020年全国大学生数学建模竞赛赛题 选题建议
  15. Java软件架构设计
  16. 【U8+】用友U8+删除已经使用过的操作员
  17. vue 生命周期 返回不触发_Vue生命周期activated之返回上一页不重新请求数据操作...
  18. 携自游家逐浪新能源汽车赛道的李一男不想被同代人抛下
  19. bzoj1296 [SCOI2009]粉刷匠
  20. 【实战】Unity3d实战之Unity3d网络游戏实战篇(11):消息分发

热门文章

  1. 构建根文件系统之busybox(三)最小根文件系统
  2. ESP8266 SD卡FTP库测试报告、D1miniESP8266 SD卡FTP测试
  3. 【编程通识】PlantUML绘制时序图样例
  4. 关于STM32像EPROM一样可以单字节写内部Flash的理解
  5. 【ELK】ELK集群搭建(ElasticSearch Logstash Kinaba)
  6. 不常见但很有用的chrome调试工具使用方法
  7. Deep Residual Learning for Image Recognition(MSRA-深度残差学习)
  8. 【iOS】【项目全局动态埋点】Runtime+Aspects(hook)
  9. 配置Java开发环境
  10. WP8.1学习系列(第一章)——添加应用栏