Qt多线程开发(QThread)
关于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)相关推荐
- Qt 多线程(QThread)
Qt 多线程(QThread) 一.理解QThread 关于QThread,参考qt助手中的解析 Detailed Description A QThread object manages one t ...
- 【Qt】Qt多线程开发—实现多线程设计的四种方法
Qt-使用Qt实现多线程设计的四种方法 文章目录 Qt-使用Qt实现多线程设计的四种方法 一.写在前面 二.[方法一] QThread:带有可选事件循环的底层API 三.[方法二] QThreadPo ...
- Qt多线程编程(一)入门篇
目录 一.多线程是什么 二.为什么要使用多线程进行开发 1.提高处理效率 2.软件运行更加流畅 3.根据优先级依次处理 三.Qt多线程入门 QThread类,类成员及类成员函数介绍 公有变量 公有函数 ...
- QT多线程调用摄像头录屏软件开发
QT多线程调用摄像头录屏软件开发 文章目录 QT多线程调用摄像头录屏软件开发 前言 一.调用摄像头 二.UI界面设计 1.Button 2.鼠标选择矩形框录制 3.ffmpeg命令行压缩 总结 前言 ...
- Qt多线程-QThread
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThread 本文地址:http://techieliang.com/2 ...
- Qt 线程基础(QThread、QtConcurrent等)
昨晚看Qt的Manual,突然发现下一个版本的Qt中(Qt4.7.4.Qt4.8等)增加了一个特赞的介绍多线程的文章 : Thread Basics 注意: 该链接以后会失效,但是 到时候你直接看Qt ...
- Qt+QtWebApp开发笔记(一):QtWebApp介绍、下载和搭建基础封装http轻量级服务器Demo
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130631547 红胖子网络科技博文大全:开发技术集合( ...
- (二)Qt多线程实现海康工业相机图像实时采集
系列文章目录 提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 文章目录 系列文章目录 ...
- QT 多线程创建方法及应用实例
QT 多线程创建方法及应用实例 方法一: (1)创建一个QT应用 (2)创建线程类,继承QThread simplethreadone.h #ifndef SIMPLETHREADONE_H #def ...
最新文章
- Fedora 提出统一流程,弃用上千 Python 2 软件包更可控
- 代码参数里的 payload 究竟是什么意思
- oracle普通用户使用dbms函数,oracle使用DBMS_SCHEDULER调度作业
- SAP FBCJ现金日记帐增强操作手册
- java中的後綴表達式_求Java堆栈,将中缀算术表达式转换成后缀表达式。
- couchdb java 连接_CouchDB客户端连接的说明---Java版
- UI5 metadata usage in the runtime
- gridlayoutmanager 设置间距_不设置主灯的客厅应当如何保证较好的灯光分布?
- 【渝粤教育】广东开放大学 标准化理论与方法 形成性考核 (50)
- 结构体+sort方法
- 云图说|数据仓库服务 GaussDB(DWS) 的“千里眼、顺风耳”—数据库智能运维
- php 升级 源码,通过编译安装升级php(保证原有的扩展不变)
- 计算机辅助电话调查系统,基于XML题型定制的计算机辅助电话调查系统问卷设计与实现...
- 服务器延迟和时间偏移怎么设置,针对大量时间偏移配置 W32Time - Windows Server | Microsoft Docs...
- 禁用和卸载树莓派 4B 上 avahi-daemon
- win10固态硬盘分区 整数_台式机械硬盘怎么安装?机械硬盘安装图解教程(SATA固态可参考)...
- 2021辽宁省大学生程序设计大赛部分题解
- 如何获取保存阿里云的图片url
- 科技、家电巨头混战AIoT:谁是未来十年的新入口?
- 【资源分享】Echarts中国地图、世界地图JSON数据(包括省市、经纬度、世界地图国家名称中英对照)