第73课qt中的多线程编程

author author     2022-08-20     707

关键词:

1. QThread

(1)QThread是一个跨平台的多线程解决方案

(2)QThread以简洁易用的方式实现多线程编程

技术分享 

2. QThread中的关键成员函数

(1)virtual void run() 线程函数,用于定义线程功能(执行流)。

(2)void start():启动函数,将线程入口地址设置为run函数。启动线程,新线程开始执行run函数

(3)int exec()进入事件循环,直至调用exit()。返回线程退出事件循环的返回码。

(4)void terminate():强制结束线程(不推荐)。

【编程实验】多线程编程初探

//main.cpp

#include <QCoreApplication>
#include <QThread>
#include <QtDebug>

class MyThread : public QThread
{
protected:
    //线程函数
    void run()
    {
        qDebug() << objectName() << " : " << "run() begin";

        for(int i=0; i<5; i++)
        {
            qDebug() << objectName() << " : " << i;

            sleep(1);
        }
        qDebug() << objectName() << " : " << "run() end";
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "main() begin";

    MyThread t1;

    t1.setObjectName("t1");
    t1.start();

    MyThread t2;
    t2.setObjectName("t2");
    t2.start();

    for(int i=0; i<100000; i++)
    {
        for(int j=0; j<10000; j++)
        {

        }
    }

    qDebug() << "main() end";

    return a.exec();
}

3. 线程对象和线程的生命周期

(1)线程对象的生命期

  ①线程对象指的是由QThread类定义的一个对象,是一个Qt对象。其生命周期与一般的Qt对象具有相同的特点

  ②每个Qt对象都关联唯一一个线程环境,对象有明确的线程属性。当一个对象在某线程中,这就和该线程建立血缘关系,这种关系会一直保持到它死去或者被moveToThread到另一个线程中。

(2)线程的生命期

技术分享 

(3)线程对象和线程的关系

  ①QThread类的“线程对象”能够开启新的线程,但它本身所处的线程与新线程不是同一个线程线程对象和线程是两个不同的概念

  ②线程对象的生命周期必须由该对象创建出来的线程的生命周期。线程对象先出生,线程后出生,线程先死亡,线程对象后死亡。(这个设计原则对于所有用面向对象封装线程的平台都适用)

  ③不同线程间的对象之间不能发展成为父子关系,因为线程这种父子关系随时可能因线程的终止而终止,具有不可预见性。这也告诉我们不要在线程对象的run()函数中创建新的局部对象,并将this指针传递给该新对象作为其parent。因为this指的是线程对象本身,与这个新的局部对象位于两个不同的线程中。

4. 线程的终止

(1)暴力终止调用terminate()。但特别强调,在工程开发中该函数是禁止使用的!terminate会使得操作系统暴力终止线程,而不会才考虑数据完整性,资源释放等问题。

(2)优雅终止线程的解决方案

  ①run()函数执行结束是优雅终止线程的唯一方式

  ②在线程类中增加标志变量m_toStop(volatile bool)

  ③通过m_toStop的值判断是否需要从run()函数返回。

【编程实验】优雅的线程控制

//main.cpp

 

5. 小结

(1)QThread是一个跨平台的多线程解决方案

(2)QThread以简洁易用的方式实现多线程编程。

(3)void run()函数用于实现线程执行体。

(4)void start()启动线程并执行run()函数

(5)工程中禁用void terminate()函数结束线程。

第54课qt中的多页面切换组件

1.多页面切换组件(QTabWidget)(1)能够在同一个窗口中自由切换不同页面的内容(2)是一个容器类型的组件,同时提供友好的页面切换方式2.QTabWidget的使用方式(1)在应用程序中创建QTabWidget的对象(2)将其他QWidget对象加入该... 查看详情

qt中的多线程编程(代码片段)

    QThread编程示例classMyThread:publicQThread//创建线程类protected:voidrun()//线程入口函数for(inti=0;i<5;i++)qDebug()<<objectName()<<":"<<i;sleep(1)//暂停1s; 多线程编程初 查看详情

Qt中的多线程数据处理管道

】Qt中的多线程数据处理管道【英文标题】:MultithreadeddataprocessingpipelineinQt【发布时间】:2011-11-1115:26:26【问题描述】:在Qt中解决以下问题的好方法是什么:我有一个传感器类,它不断产生数据。在这个数据上,需要一个接一... 查看详情

qt学习笔记8.qt中的多线程

一、界面线程与工作线程GUI程序的主线程:GUI的用户输入主要来自鼠标、键盘,称为事件。处理事件的主循环,称为事件循环。这个用于处理各种界面的线程,称为界面线程GUI界面卡死所有的事件处理函数(slots)都应该迅速返回... 查看详情

纯 C++ 中的多线程?

】纯C++中的多线程?【英文标题】:MultithreadinginpureC++?【发布时间】:2013-09-1216:38:17【问题描述】:让我澄清一下,我知道c++11中添加了多线程支持。但在此更新之前,多线程只能在C++中的Qt中完成。所以,Qt如何提供此功能而不... 查看详情

c++ windows中客户端服务器编程中的多线程

】c++windows中客户端服务器编程中的多线程【英文标题】:Multithreadinclientserverprogramminginc++windows【发布时间】:2014-04-1911:56:52【问题描述】:我有一个问题,如何同时向客户发送字符串。我的程序将客户端放入队列中,因此当第... 查看详情

qt不同平台对线程如何支持和实现

...的功能,同时也避免了不安全的现象发生。本文不仅对Qt中的多线程支持机制进行了讨论,还着重探讨了利用定时器机制模拟多线程编程的方法。1、系统对多线程编程的支持不同的平台对Qt的多线程支持方式是不同的。当用户在W... 查看详情

第38课qt中的事件处理(上)

...nbsp;(2)思考:操作系统发送的消息如何转变为Qt信号2.Qt中的事件处理(1)Qt平台将系统产生的消息转换为Qt事件  ①Qt事件是一个QEvent的对象  ②Qt事件用于描述程序内部或外部发生的动作  ③任意的QObject对象都具备事... 查看详情

单核中的多线程与异步编程

】单核中的多线程与异步编程【英文标题】:MultithreadedvsAsynchronousprogramminginasinglecore【发布时间】:2021-12-1403:24:41【问题描述】:如果CPU一次只实时执行一项任务,那么多线程与单处理器系统中的异步编程(在效率方面)有何不... 查看详情

第39课qt中的事件处理(下)

1.事件的传递过程 (1)操作系统检测到用户动作时,会产生一条系统消息,该消息被发送到Qt应用程序(2)Qt应用程序收到系统消息后,将其转化为一个对应的事件对象,并将其分发出去。(3)事件对应被分发到当前正在操... 查看详情

第47课qt中的调色板

1.QPalette类(1)QPalette类提供了绘制QWidget组件的不同状态所使用的颜色。(2)QPalette对象包含了3个状态的颜色描述  ①激活颜色组(Active):组件获得焦点使用的颜色搭配方案  ②非激活颜色组(Inactive):组件失去焦点使... 查看详情

第13章tcp编程_基于自定义协议的多线程模型

7.基于自定义协议的多线程模型(1)服务端编程  ①主线程负责调用accept与客户端连接  ②当接受客户端连接后,创建子线程来服务客户端,以处理多客户端的并发访问。  ③服务端接到的客户端信息后,回显给客户端(... 查看详情

使用 Qt 的多线程应用程序有啥问题(错误 SIGSEGV)

...012-01-2312:19:48【问题描述】:我是Qt的新手,我正在寻找Qt中的多线程。正如我在QtDocuments中了解到的,我为两个线程定义了两个类:#include<QThr 查看详情

python中的多线程和多进程编程(代码片段)

注意:多线程和多线程编程是不同的!!!第一点:一个进程相当于一个要执行的程序,它会开启一个主线程,多线程的话就会再开启多个子线程;而多进程的话就是一个进程同时在多个核上进行;第二点:多线程是一种并发操... 查看详情

第13章c#中的多线程

...序(Program)是对数据描述与操作的代码的集合,如Office中的Word,影音风暴等应用程序。进程(Process)是程序的一次动 查看详情

为android编程时的多线程问题

】为android编程时的多线程问题【英文标题】:MultiThreadingissueswhileprogramingforandroid【发布时间】:2011-01-0410:44:10【问题描述】:我正在Android上开发,但这个问题在任何其他Java平台上可能同样有效。我开发了一个多线程应用程序。... 查看详情

与记录器线程的多线程应用程序交互

】与记录器线程的多线程应用程序交互【英文标题】:Multi-threadedapplicationinteractionwithloggerthread【发布时间】:2010-12-0911:33:10【问题描述】:我再次提出关于多线程的问题和我的并发编程课的练习。我有一个多线程服务器-使用.NET... 查看详情

第61课模型视图中的委托(上)

...图对用户输入的处理(1)传统的MVC设计模式 (2)Qt中的模型视图设计模式如何处理用户输入?  ①视图中集成了处理用户输入的功能(即委托)  ②视图将用户输入作为内部独立的子功能来实现  ③模型负责组织数... 查看详情