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函数,因为使用这个函数可能会出现意想不到的错误。

目录
打赏
0
0
0
0
15
分享
相关文章
|
11月前
|
【Qt 线程】深入探究QThread线程优先级:原理、应用与最佳实践
【Qt 线程】深入探究QThread线程优先级:原理、应用与最佳实践
774 0
|
11月前
|
Qt经典面试题:Qt开启线程的几种方式
Qt经典面试题:Qt开启线程的几种方式
184 0
|
11月前
|
Linux与Qt线程优先级的对应关系:一次全面解析
Linux与Qt线程优先级的对应关系:一次全面解析
164 0
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
2083 3
Qt线程池+生产者消费者模型
Qt线程池+生产者消费者模型
453 5
QT多线程
本文详细介绍了在Qt中如何正确使用QThread以及信号槽跨线程的使用方式,包括线程的正确退出方法和QObject在不同线程中创建子对象时可能遇到的问题。同时,文章还提供了相关博客和资料的链接,用于进一步学习和参考。
105 3
qt对sqlite数据库多线程的操作
本文总结了在Qt中进行SQLite数据库多线程操作时应注意的四个关键问题,包括数据库驱动加载、加锁、数据库的打开与关闭,以及QsqlQuery变量的使用。
391 1
|
7月前
自己动手写QT多线程demo
本文是作者关于如何编写Qt多线程demo的教程,介绍了如何实现多线程功能,包括可暂停和继续的功能。文章提供了部分示例代码,展示了如何创建线程类、启动和管理线程,以及线程间的通信。同时,还提供了相关参考资料和免费下载链接。
174 0
|
9月前
|
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
246 6
|
11月前
|
【C++ 与Qt 线程】C++ std::thread 与Qt qthread多线程混合编程
【C++ 与Qt 线程】C++ std::thread 与Qt qthread多线程混合编程
428 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等