关键词:
一、Qt中通过QThread直接支持多线程
1、QThread是一个跨平台的多线程解决方案
2、QThread以简洁易用的方式实现多线程编程
注意:1、Qt中的线程以对象的形式被创建和使用
2、每一个线程对应着一个QThread对象
QThread这个类,是一个线程父类,我们需要继承这个QThread类。
QThread类,提供了一组成员函数。一个线程是以一个对象的形式来表现出来,所以说,我们创建一个
线程的时候,实际上就是创建了一个这个QThread线程类的对象
一个线程对应一个QThread对象
二、QThread中的关键成员函数
1、void run()
线程体函数,用于定义线程功能(执行流),是线程的入口函数。
2、void start()
启动函数,在操作系统中真正创建出一个线程后,将线程入口地址设置为run函数
3、void terminate()
强制结束线程(不推荐)
三、自定义一个线程类
class MyThread : public QThread { protected: //保护,被保护的成员函数,不能直接被外界访问,但是可以被子类直接访问 void run() //重写QThread类中的run成员函数,来实现我们线程体逻辑 { for ( int i = 0; i < 5; i++) { qDebug() << objectName() <<i; //objectName,当前对象的名字 sleep(1); //这个sleep函数,是QThread类里面的一个静态的成员函数 } } }; int main(int argc, char *argv[]) { MyThread t; //创建子线程 t.setobjectName("t"); //设置t对象的名字为t t.start(); //启动子线程 MyThread tt; //又创建了一个线程 tt.setobjectName("tt"); tt.start(); }
可以说是三个线程上面的,因为还包含了主线程,三个线程是并行执行的。宏观上。
注意:上面代码,主线程将先于子线程结束,所有子线程全部结束后,进程结束。
一个进程的结束,要等待内部的所有线程都结束后,才会结束。
四、线程的生命周期
1、用线程类创建一个对象时,可以说我们已经创建一个线程了,被创建的线程对象
调用start成员函数后,线程开始运行,运行的是run成员函数体,该线程参与操作
系统的调度,操作系统给每一个线程一定的时间片时间去执行,时间片到了当前线程
停止运行,其他线程运行它的时间片,如此调度,所以从单核cpu的角度看,微观看,线程
是顺序执行,由操作系统切换每个线程的执行。线程的非正常死亡之一是因terminate()
成员函数导致,所以terminate成员函数不推荐使用,因为不会考虑数据的完整性,
会暴力的杀死线程,可能会导致资源没有被释放,数据不完整等,所以在工程中
禁止调用。
2、不调用terminate()成员函数去结束一个线程,那如何优雅的结束一个线程的生命期呢?
(1)解决方案思路:
run()函数执行结束是优雅终止线程的唯一方式,因为是线程的自然死亡,run成员函数被执行完了
run成员函数被正常的返回了,这种叫做正常的死亡,所以在线程类中增加一个标志变量m_toStop(volatile bool),通过m_toStop的值判断是否需要从run()函数返回。run函数返回,为优雅
的结束线程 。volatile关键字必须去修饰这个标志变量,不需要编译去优化,而是我们每次都会去内存中去取这个值,值是易变的,所以加volatile。
3、代码如下
class MyThread :public QThread { protected: volatile bool m_toStop; void run(); public: MyThread() { m_toStop = false; } void stop() { m_toStop = true; } }; void MyThread::run() { while (!m_toStop) { } }
上面的代码,如果run函数中的while循环中,判断到了m_toStop变量值为true了,
则会不执行while循环,跳出while循环,向下执行后,run函数就会自己返回,这个
方法是工程中,结束一个线程执行的一个很好的方法,标准优雅的去结束一个线程。
class MyThread :public QThread { protected: volatile bool m_toStop; void run() { int *p = new int[10000]; //申请了10000*int大小的堆空间让p指向 for ( int i = 0; !m_toStop && (i < 10); i++ ) { p[i] = i * i; sleep(1); } delete[] p; } public: MyThread() { m_toStop = false; } void stop() { m_toStop = true; } };
int main(void)
{
MyThread t;
t.start();
Sleep(5000);
t.stop(); //优雅的结束线程
}
本文出自 “whylinux” 博客,请务必保留此出处http://whylinux.blog.51cto.com/10900429/1917910
qt中的多线程编程(代码片段)
QThread编程示例classMyThread:publicQThread//创建线程类protected:voidrun()//线程入口函数for(inti=0;i<5;i++)qDebug()<<objectName()<<":"<<i;sleep(1)//暂停1s; 多线程编程初 查看详情
第54课qt中的多页面切换组件
1.多页面切换组件(QTabWidget)(1)能够在同一个窗口中自由切换不同页面的内容(2)是一个容器类型的组件,同时提供友好的页面切换方式2.QTabWidget的使用方式(1)在应用程序中创建QTabWidget的对象(2)将其他QWidget对象加入该... 查看详情
qt学习笔记8.qt中的多线程
一、界面线程与工作线程GUI程序的主线程:GUI的用户输入主要来自鼠标、键盘,称为事件。处理事件的主循环,称为事件循环。这个用于处理各种界面的线程,称为界面线程GUI界面卡死所有的事件处理函数(slots)都应该迅速返回... 查看详情
纯 C++ 中的多线程?
】纯C++中的多线程?【英文标题】:MultithreadinginpureC++?【发布时间】:2013-09-1216:38:17【问题描述】:让我澄清一下,我知道c++11中添加了多线程支持。但在此更新之前,多线程只能在C++中的Qt中完成。所以,Qt如何提供此功能而不... 查看详情
qt不同平台对线程如何支持和实现
...的功能,同时也避免了不安全的现象发生。本文不仅对Qt中的多线程支持机制进行了讨论,还着重探讨了利用定时器机制模拟多线程编程的方法。1、系统对多线程编程的支持不同的平台对Qt的多线程支持方式是不同的。当用户在W... 查看详情
Qt中的多线程数据处理管道
】Qt中的多线程数据处理管道【英文标题】:MultithreadeddataprocessingpipelineinQt【发布时间】:2011-11-1115:26:26【问题描述】:在Qt中解决以下问题的好方法是什么:我有一个传感器类,它不断产生数据。在这个数据上,需要一个接一... 查看详情
单核中的多线程与异步编程
】单核中的多线程与异步编程【英文标题】:MultithreadedvsAsynchronousprogramminginasinglecore【发布时间】:2021-12-1403:24:41【问题描述】:如果CPU一次只实时执行一项任务,那么多线程与单处理器系统中的异步编程(在效率方面)有何不... 查看详情
使用 Qt 的多线程应用程序有啥问题(错误 SIGSEGV)
...012-01-2312:19:48【问题描述】:我是Qt的新手,我正在寻找Qt中的多线程。正如我在QtDocuments中了解到的,我为两个线程定义了两个类:#include<QThr 查看详情
python中的多线程和多进程编程(代码片段)
注意:多线程和多线程编程是不同的!!!第一点:一个进程相当于一个要执行的程序,它会开启一个主线程,多线程的话就会再开启多个子线程;而多进程的话就是一个进程同时在多个核上进行;第二点:多线程是一种并发操... 查看详情
c++ windows中客户端服务器编程中的多线程
】c++windows中客户端服务器编程中的多线程【英文标题】:Multithreadinclientserverprogramminginc++windows【发布时间】:2014-04-1911:56:52【问题描述】:我有一个问题,如何同时向客户发送字符串。我的程序将客户端放入队列中,因此当第... 查看详情
与记录器线程的多线程应用程序交互
】与记录器线程的多线程应用程序交互【英文标题】:Multi-threadedapplicationinteractionwithloggerthread【发布时间】:2010-12-0911:33:10【问题描述】:我再次提出关于多线程的问题和我的并发编程课的练习。我有一个多线程服务器-使用.NET... 查看详情
java的并发编程中的多线程问题到底是怎么回事儿?
在我之前的一篇《再有人问你Java内存模型是什么,就把这篇文章发给他。》文章中,介绍了Java内存模型,通过这篇文章,大家应该都知道了Java内存模型的概念以及作用,这篇文章中谈到,在Java并发编程中,通常会遇到三个问... 查看详情
Tkinter GUI 中的多线程,不同类中的线程
】TkinterGUI中的多线程,不同类中的线程【英文标题】:MultithreadinginTkinterGUI,threadsindifferentclasses【发布时间】:2016-08-2611:13:20【问题描述】:我目前正在学习TkinterGUI编程。而且我被困在多线程概念的某个地方。尽管这个话题在这... 查看详情
qt的多线程使用(代码片段)
Qt中提供了对于线程的支持,它提供了一些独立于平台的线程类,要进行多线程方法,可以有两种方式。1.第一种方式qt提供QThread类,在QThread类中有一个virtual函数QThread::run()。要创建一个新的线程,我们只需定义一个MyThread类,... 查看详情
对 C# 循环中的多线程感到困惑 [重复]
】对C#循环中的多线程感到困惑[重复]【英文标题】:Confusedaboutmulti-threadinginaloopforC#[duplicate]【发布时间】:2012-03-0807:11:31【问题描述】:可能重复:C#CapturedVariableInLoop我对多线程编程很陌生。当我运行下面的代码时,只有最后... 查看详情
androidnativeapp开发笔记:多线程编程(代码片段)
文章目录目的Java中的多线程ThreadRunnableTimerAndroid中的多线程HandlerAsyncTask总结目的Android中UI线程对于开发者和用户来说都是最主要接触到的线程。一般来说为了UI流畅、不卡顿,耗时操作是不推荐放在UI线程中的。但是耗时操... 查看详情
java并发编程解析|如何正确理解java领域中的多线程模型,主要用来解决什么问题?
苍穹之边,浩瀚之挚,眰恦之美;悟心悟性,善始善终,惟善惟道!——朝槿《朝槿兮年说》写在开头我国宋代禅宗大师青原行思在《三重境界》中有这样一句话:“参禅之初,看山是山,看水是水;禅有悟时,看山不是山,看... 查看详情
qt不同平台对线程如何支持和实现
...了满足用户构造复杂图形界面系统的需求,Qt提供了丰富的多线程编程支持。从2.2版本开始,Qt主要从下面三个方面对多线程编程提供支持:一、构造了一些基本的与平台无关的线程类;二、提交用户自定义事件的Thread-safe方式;... 查看详情