QT多线程基础

简介: QT多线程基础

前言

本篇文章来讲解一下QT中的多线程使用方法。

其实线程这个概念对于我们来说并不陌生,main函数在多线程中一般就被称为主线程。

在QT中,使用QThread类可以方便地创建新的线程并在其中执行任务。以下介绍一些常用的QT多线程的技术和方法。

一、多线程概念介绍

多线程是指一个进程中包含至少两个执行流,即多个线程,每个线程都可以独立运行,访问该进程中的共享资源,并且可以与其它线程同步行动。多线程应用程序通常比单线程应用程序具有更好的响应速度和更好的资源利用率,适合于一些需要高效处理大量数据和执行复杂任务的场景。

在多线程应用中,程序的执行流被抽象为线程,每个线程都有自己的执行上下文,包括寄存器、堆栈和程序计数器等,线程之间共享进程地址空间中的数据和资源。线程之间的通信和同步主要通过共享内存和同步原语来实现,如信号量、互斥锁和条件变量等。

多线程可以提高程序效率,但也会增加线程的并发开销和线程安全问题。


二、创建一个线程

在QT中创建一个线程需要使用到QThread的这个类。

这里定义一个Mythread类这个类继承自QThread,要想使用多线程我们需要重写run()函数,run()函数就是线程执行的主体,将需要处理的逻辑放入run函数中执行即可。

#include <QCoreApplication>
#include <QDebug>
#include <QThread>
class Mythread : public QThread
{
protected:
    void run()
    {
        for(int i = 0; i < 5; i++)
        {
            qDebug() << "Mythread";
            sleep(1);   //休眠1s
        }
    }
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Mythread t1;
    t1.start();
    for(int i = 0; i < 5; i++)
    {
        qDebug() << "Main Thread";
        QThread::sleep(1);   //休眠1s
    }
    return a.exec();
}

执行效果:

可以看到主线程和创建出来的线程并发执行互不干扰。


三、start和terminate函数

QThread 类在启动新线程时使用 start() 函数,该函数的作用是将 run() 函数放入一个新线程并在新线程中启动执行代码。根据 Qt 的官方文档,start() 函数应该被认为是线程对象的构造函数,因为每次调用 start() 函数都会生成一个新的线程对象。

当需要中止线程时,terminate() 是一个用于中止线程的函数。但建议不要使用 terminate() 函数,在大多数情况下这会导致未定义的行为,而且可能会造成数据损失或未同步的状态。terminate()函数是暴力终止线程的方法,他是直接让线程终止,并不会等到线程退出后再将线程结束,在实际开发中一般不建议使用这个函数。


四、如何不使用terminate函数终止线程

解决方法:设置一个标志位当需要终止线程时设置这个标志位。

在Mythread中提供一个标志位变量,并且提供一个stop()函数,当需要将线程终止时将这个m_stop设置为true即可。

#include <QCoreApplication>
#include <QDebug>
#include <QThread>
class Mythread : public QThread
{
    bool m_stop;
protected:
    void run()
    {
        for(int i = 0; (!m_stop) && (i < 5); i++)
        {
            qDebug() << "Mythread";
            sleep(1);   //休眠1s
        }
    }
public:
    void stop()
    {
        m_stop = true;
    }
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Mythread t1;
    t1.start();
    for(int i = 0; i < 5; i++)
    {
        qDebug() << "Main Thread";
        QThread::sleep(1);   //休眠1s
        if(i == 3)
        {
            t1.stop();
        }
    }
    return a.exec();
}

运行效果:

总结

多线程是非常重要的一个知识点,大家需要将他掌握,需要注意的就是终止线程时不要使用terminate函数,因为使用这个函数可能会出现意想不到的错误。

相关文章
|
3月前
|
算法 Unix 调度
【Qt 线程】深入探究QThread线程优先级:原理、应用与最佳实践
【Qt 线程】深入探究QThread线程优先级:原理、应用与最佳实践
276 0
|
3月前
|
安全 Java
Qt经典面试题:Qt开启线程的几种方式
Qt经典面试题:Qt开启线程的几种方式
82 0
|
3月前
|
算法 Unix Linux
Linux与Qt线程优先级的对应关系:一次全面解析
Linux与Qt线程优先级的对应关系:一次全面解析
58 0
|
3月前
|
存储 并行计算 安全
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析(二)
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析
125 0
|
3月前
|
安全 数据处理 C++
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
774 3
|
3月前
|
存储 安全 Java
Qt线程池+生产者消费者模型
Qt线程池+生产者消费者模型
101 5
|
1月前
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
|
3月前
|
存储 消息中间件 缓存
C++ Qt开发:运用QThread多线程组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QThread`组件实现多线程功能。
44 2
C++ Qt开发:运用QThread多线程组件
|
3月前
|
Java API C++
【C++ 与Qt 线程】C++ std::thread 与Qt qthread多线程混合编程
【C++ 与Qt 线程】C++ std::thread 与Qt qthread多线程混合编程
176 1
|
3月前
|
安全 数据处理 API
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析(一)
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析
124 0