关于QT多线程开发介绍

  • QT下线程的创建方式
    Qt中主要有两种创建多线程的方式,一种是直接继承QThread重写run()函数来实现,另外一种是将一个继承于QObject的普通类通过moveToThread()方法移动到一个线程里去。 本文主要是理清如何正确的创建一个线程,和如何正确的退出一个线程。

本文主要记录QThread的普通用法,网上有许多相关资料,如果已经了解可忽视,本文重点介绍线程安全退出的方法。

  • 继承QThread重写run()函数线程创建方式
//.h文件
class Mythread:public QThread
{Q_OBJECT
public:Mythread(){}~ Mythread(){}virtual void run();/*******************/
};
/****************************/
//.cpp文件
void Mythread::run()
{while (1){//耗时操作   }
}
  • 继承于QObject的普通类通过moveToThread()方法移动到一个线程的创建方式
//.h文件
class Mythread:public QThread
{Q_OBJECT
public:Mythread(){}~ Mythread(){}virtual void run();/*******************/
};
class MoveThread:public QObject
{Q_OBJECT
public:MoveThread(){}~MoveThread(){}
};
class MainWindow : public QMainWindow
{Q_OBJECT
public:explicit MainWindow(QWidget *parent = 0);~MainWindow();
private:Ui::MainWindow *ui;Mythread * m_thread;MoveThread * m_movethread;
};
//.cpp文件
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);m_thread= new Mythread ();m_movethread= new MoveThread ();m_movethread->moveToThread(m_thread);
}

二者创建线程的优缺点和差异在以后文章中会单独列出(关于Qt多线程下信号槽的调用机制及事件循环机制的介绍)

  • QT线程开启和退出
    线程开启函数:start()

不应该直接调用run函数,而应该使用**start()**函数

线程退出函数:quit()、exit()、terminate()用于线程终结退出

1.quit()函数告诉线程退出事件循环,让exec()返回0(成功)。等同于调用QThread::exit(0)。如果线程没有事件循环,这个函数什么事也不做。

2.exit()函数通知线程退出事件循环,并且传入一个code值。
调用该函数后,线程退出事件循环,并从QEventLoop::exec()调用中返回。QEventLoop::exec()返回一个returnCode码。一般情况,返回码为0意味着调用成功,非0值代表失败。
注意:和c库同名的函数不一样,调用该函数不返回一个值,它仅仅产生一个停止事件。

3.terminate()函数立即终止一个线程可以使用,但这个函数存在非常不安定因素,不推荐使用

4.线程调用wait()函数可以阻断本身的运行,直到其他的线程完成执行(或者一个指定的时间间隔后)。

  • 如何安全退出Qt线程

方法是添加一个bool变量,通过主线程修改这个bool变量来进行终止,但这样有可能引起访问冲突,所以需要加锁联合使用。具体操作如下:

//.h文件
class Mythread:public QThread
{Q_OBJECT
public:Mythread();~Mythread();virtual void run();void runstart(){isCanRun=true;}void runstop(){isCanRun=false;}bool getcurrentstate(){return isCanRun;}/**********变量区**********/
protected:volatile bool isCanRun = false;
public slots:void stopImmediatelyS1();
private:static QMutex m_lock; //原子操作锁/*******************/
};
//.cpp文件
Mythread::Mythread()
{isCanRun = false;connect(this,SIGNAL(finished()),this,SLOT(deleteLater()));
}
QMutex Mythread::m_lock; //初始化静态锁
Mythread::~Mythread()
{}
void Mythread::stopImmediatelyS1()
{QMutexLocker locker(&m_lock);isCanRun = false;
}
void Mythread::run()
{isCanRun = true;while (isCanRun){//耗时操作{QMutexLocker locker(&m_lock);if(!isCanRun) //设置退出线程{return;}}exec();//开启事件循环}
}

这里是引用:本文是个人开发学习记录,如有差错欢迎大神指点

Qt多线程开发(QThread)相关推荐

  1. Qt 多线程(QThread)

    Qt 多线程(QThread) 一.理解QThread 关于QThread,参考qt助手中的解析 Detailed Description A QThread object manages one t ...

  2. 【Qt】Qt多线程开发—实现多线程设计的四种方法

    Qt-使用Qt实现多线程设计的四种方法 文章目录 Qt-使用Qt实现多线程设计的四种方法 一.写在前面 二.[方法一] QThread:带有可选事件循环的底层API 三.[方法二] QThreadPo ...

  3. Qt多线程编程(一)入门篇

    目录 一.多线程是什么 二.为什么要使用多线程进行开发 1.提高处理效率 2.软件运行更加流畅 3.根据优先级依次处理 三.Qt多线程入门 QThread类,类成员及类成员函数介绍 公有变量 公有函数 ...

  4. QT多线程调用摄像头录屏软件开发

    QT多线程调用摄像头录屏软件开发 文章目录 QT多线程调用摄像头录屏软件开发 前言 一.调用摄像头 二.UI界面设计 1.Button 2.鼠标选择矩形框录制 3.ffmpeg命令行压缩 总结 前言 ...

  5. Qt多线程-QThread

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThread     本文地址:http://techieliang.com/2 ...

  6. Qt 线程基础(QThread、QtConcurrent等)

    昨晚看Qt的Manual,突然发现下一个版本的Qt中(Qt4.7.4.Qt4.8等)增加了一个特赞的介绍多线程的文章 : Thread Basics 注意: 该链接以后会失效,但是 到时候你直接看Qt ...

  7. Qt+QtWebApp开发笔记(一):QtWebApp介绍、下载和搭建基础封装http轻量级服务器Demo

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130631547 红胖子网络科技博文大全:开发技术集合( ...

  8. (二)Qt多线程实现海康工业相机图像实时采集

    系列文章目录 提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 文章目录 系列文章目录 ...

  9. QT 多线程创建方法及应用实例

    QT 多线程创建方法及应用实例 方法一: (1)创建一个QT应用 (2)创建线程类,继承QThread simplethreadone.h #ifndef SIMPLETHREADONE_H #def ...

最新文章

  1. Fedora 提出统一流程,弃用上千 Python 2 软件包更可控
  2. 代码参数里的 payload 究竟是什么意思
  3. oracle普通用户使用dbms函数,oracle使用DBMS_SCHEDULER调度作业
  4. SAP FBCJ现金日记帐增强操作手册
  5. java中的後綴表達式_求Java堆栈,将中缀算术表达式转换成后缀表达式。
  6. couchdb java 连接_CouchDB客户端连接的说明---Java版
  7. UI5 metadata usage in the runtime
  8. gridlayoutmanager 设置间距_不设置主灯的客厅应当如何保证较好的灯光分布?
  9. 【渝粤教育】广东开放大学 标准化理论与方法 形成性考核 (50)
  10. 结构体+sort方法
  11. 云图说|数据仓库服务 GaussDB(DWS) 的“千里眼、顺风耳”—数据库智能运维
  12. php 升级 源码,通过编译安装升级php(保证原有的扩展不变)
  13. 计算机辅助电话调查系统,基于XML题型定制的计算机辅助电话调查系统问卷设计与实现...
  14. 服务器延迟和时间偏移怎么设置,针对大量时间偏移配置 W32Time - Windows Server | Microsoft Docs...
  15. 禁用和卸载树莓派 4B 上 avahi-daemon
  16. win10固态硬盘分区 整数_台式机械硬盘怎么安装?机械硬盘安装图解教程(SATA固态可参考)...
  17. 2021辽宁省大学生程序设计大赛部分题解
  18. 如何获取保存阿里云的图片url
  19. 科技、家电巨头混战AIoT:谁是未来十年的新入口?
  20. 【资源分享】Echarts中国地图、世界地图JSON数据(包括省市、经纬度、世界地图国家名称中英对照)

热门文章

  1. L298N驱动4个电机驱动小车
  2. Java怎么打开TMX,TMX 的 Java 类库 Otter TMX
  3. 数码类测评:dido G28S Pro心电血压智能手表
  4. 八大无法解释的神秘声音
  5. 为什么越来越多人患上植物神经紊乱?或许与这些因素有关
  6. 三甲医院医生曝20年工资涨20倍 隐性收入远超工资
  7. 等价类划分法测试网易邮箱注册功能
  8. visio交叉线(跨线)去掉交叉点弯曲(弧形弯曲)的办法
  9. python 数据录入窗口_干货!用Tkinter实现简单的信息录入和查询界面!
  10. TCP/IP Illustrated Episode 3