QT多线程编程基础

简介: QT多线程编程基础

前言


一、线程,进程 介绍

线程:

操作系统中独立运行的最小单位。每个线程都有自己的执行路径、程序计数器、堆栈和一组寄存器。线程共享进程的资源,如内存和文件描述符,可以并发执行,从而提高程序的并发性和响应性。

进程:

是操作系统中运行的一个程序实例。它拥有独立的内存空间和系统资源,如文件句柄、网络连接等。一个进程可以包含多个线程,这些线程共享进程的资源。进程之间相互独立,拥有各自的地址空间和系统资源,并通过进程间通信(IPC)机制进行交互。

总结起来,线程是进程的一部分,是可以并发执行的辅助单位,共享进程的资源。进程是独立运行的程序实例,拥有独立的资源和内存空间。线程通常用于并发执行任务,而进程通常用于隔离不同的应用程序和提供资源独立性。

二、创建线程

在 Qt 中,可以使用 QThread 类来创建线程。

Qt 中的线程以对象的形式被创建和使用。每一个线程对应着一个 QThread 对象。

创建线程的一般步骤如下:

  • 定义一个继承自QThread的类。
  • 在该类中重写run()方法,并在其中实现线程的任务逻辑。
  • 创建该自定义线程类的对象。
  • 调用对象的start()方法来启动线程。
  1. void run ( )
    线程体函数,用于定义线程功能(执行流)
    具体而言,它用于启动一个新线程并调用线程的 run() 方法。
  2. void start ( )
    启动函数,将线程入口地址设置为 run 函数。
    调用 start() 后,线程会自动调用 run() 方法执行线程的任务逻辑。
  1. void terminate ( )
    强制结束线程(不推荐

示例代码:

#include <QCoreApplication>
#include <QThread>
#include <QDebug>
class MyThread : public QThread       //创建线程类
{
protected:
  void run()              //线程入口,线程体函数
    {
        qDebug() << objectName()<< " : begin";
        for(int i=0; i < 5 ;i++)
        {
            qDebug() << objectName()<< " : "<< i;
            sleep(1);           //休眠 1 秒
        }
    qDebug() << objectName()<< " : end";
    }
int main(int argc, char *argv[])      //主线程入口函数
{
    QCoreApplication a(argc, argv);
  qDebug() << "main : begin";
    MyThread t;             //创建子线程
    t.setObjectName("t1");
    t.start();              //启动线程
  qDebug() << "main : end";
  return a.exec();
}

输出结果:

注意:

示例中 主线程 将优先于 子线程 结束。

所有线程都结束后,进程结束。

三、终止线程

怎末结束线程呢

在工程开发中,terminate () 是禁止使用的! terminate ()会使操作系统 暴力终止线程,而不会考虑数据的完整性,资源释放等问题!

结束线程 方法:

设置一个标志位当需要终止线程时设置这个 标志位

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

在线程的run()方法中,定期检查标志位的状态。如果标志位为真,则线程执行完当前任务后自行退出。

#include <QCoreApplication>
#include <QThread>
#include <QDebug>
class MyThread : public QThread
{
protected:
    bool m_to_stop;     //终止标志位
    void run()      //线程入口,线程体函数
    {
        qDebug() << objectName()<< " : begin";
    for(int i=0;(!m_to_stop)&&(i<5);i++)
        {
            qDebug() << objectName()<< " : "<< i;
            sleep(1);                 //每打印一次,休眠 1 秒
    }
    qDebug() << objectName()<< " : end";
    }
public:
    MyThread()
    {
        m_to_stop = false;
    }
   void stop()
    {
        m_to_stop = true;
    }
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
  qDebug() << "main : begin";
    MyThread t;
    t.setObjectName("t1");
    t.start();
    for(int i=0;i<5;i++)
    {
        QThread::sleep(1);      //休眠
        if(i == 2)
            t.stop();       //休眠 3 秒后终止线程
    }
    qDebug() << "main : end";
  return a.exec();
}

输出结果:


总结

相关文章
|
1月前
|
安全 Java
Qt经典面试题:Qt开启线程的几种方式
Qt经典面试题:Qt开启线程的几种方式
22 0
|
1月前
|
算法 Unix Linux
Linux与Qt线程优先级的对应关系:一次全面解析
Linux与Qt线程优先级的对应关系:一次全面解析
23 0
|
1月前
|
存储 并行计算 安全
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析(二)
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析
61 0
|
1月前
|
安全 数据处理 C++
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
118 3
|
1月前
|
Java 程序员 API
【深入探究 Qt 线程】一文详细解析Qt线程的内部原理与实现策略
【深入探究 Qt 线程】一文详细解析Qt线程的内部原理与实现策略
77 0
|
1月前
|
Java API C++
【C++ 与Qt 线程】C++ std::thread 与Qt qthread多线程混合编程
【C++ 与Qt 线程】C++ std::thread 与Qt qthread多线程混合编程
45 1
|
1月前
|
安全
深入理解Qt多线程编程:QThread、QTimer与QAudioOutput的内在联系__Qt 事件循环(三)
深入理解Qt多线程编程:QThread、QTimer与QAudioOutput的内在联系__Qt 事件循环
22 0
|
1月前
|
存储 安全 程序员
深入理解Qt多线程编程:QThread、QTimer与QAudioOutput的内在联系__Qt 事件循环(二)
深入理解Qt多线程编程:QThread、QTimer与QAudioOutput的内在联系__Qt 事件循环
45 0
|
1月前
|
安全 测试技术 C++
深入理解Qt多线程编程:QThread、QTimer与QAudioOutput的内在联系__Qt 事件循环(一)
深入理解Qt多线程编程:QThread、QTimer与QAudioOutput的内在联系__Qt 事件循环
45 0
|
1月前
|
负载均衡 并行计算 安全
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析(三)
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析
46 0

热门文章

最新文章

推荐镜像

更多