(73课)qt中的多线程编程

author author     2022-08-28     168

关键词:

一、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方式;... 查看详情