Qt中的多线程编程(1)

Qt中的多线程编程(1)

进行多线程编程前,首先要搞懂几个概念:

  1. 进程:程序执行时由系统分配资源,按照执行流执行,这个过程其实就是进程。进程是操作系统分配资源的基本单位。
  2. 线程:线程是进程中的具体执行单元,一个程序从main()函数入口地址开始执行时,就有了一个进程、至少一个线程,进程是“过程”的概念;线程则是具体被系统调度、执行的。 (main函数执行结束,是不是这个进程就结束了呢?当然不是,进程内部所有线程的结束才是一个进程的结束

Qt中实现多线程的方式:
Qt支持的QThread类可以轻易地实现多线程编程。要注意的是,Qt中的线程都是以Qthread对象的形式创建和使用。线程都有开始、执行、结束,在QTread对象中主要由以下3个函数控制:

  • void start() : 线程启动,将线程的入口地址设置为run()函数。
  • void run() :线程执行体,需要重载这个函数,以实现自己的功能。在Qt 4.4版本之后,QThread中对的un()默认调用了exec(),自动开启事件循环。
  • void terminate() :强制结束线程,可能会导致线程中内存泄漏、脏数据、错误运算值等。

示例程序:

#include <QCoreApplication>
#include "QDebug"
#include "QThread"
class testThread :public QThread
{
protected:
        void run();
};
void testThread::run()
{
    qDebug()<<objectName()<<"  run() start "<<endl;
    for(int i = 0;i<3;i++)
    {
        msleep(200);
        qDebug()<< objectName() <<": "<<i<<endl;
    }
    qDebug()<<objectName()<<"  run() end "<<endl;
}
int main(int argc, char *argv[])
{
    qDebug()<<"main_beagin"<<endl;
    QCoreApplication a(argc, argv);
    testThread threadA;//创建线程 A
    threadA.setObjectName("Thread A");//设置创建线程 A的对象名
    threadA.start();//启动线程 A
    testThread threadB;//创建线程 B
    threadB.setObjectName("Thread B");//设置创建线程 B的对象名
    threadB.start();//启动线程 B
    qDebug()<<"main_end"<<endl;
    return a.exec();
}

先不看运行结果,分析这段代码,可以看到以下几点:

  1. QThread是作为父类继承的,QThread::run()中默认调用了exec()开启事件循环,因此重写run()后,不用手动调用exec();
  2. Qt中实现多线程,基本上就是对QThread对象重写run()函数。
  3. Qt中线程是使用QThread::start()启动的。为什么不直接执行run()函数呢?线程相关的初始化是在QThread构造函数中完成的,执行start()后,是由操作系统启动线程;而直接调用run(),就相当于在当前线程中执行一个普通函数。
  4. msleep(int ms);sleep(int s);等函数,是QThread类的静态函数,可以使得线程休眠相应时间。

下面看一下运行结果:
在这里插入图片描述

通过这个运行结果,可以看到:

  1. 线程可以在main()函数执行完后,继续执行。这也证明我之前所说的,进程中的所有线程结束之后,才是这个进程的结束。
  2. 线程之间是可以并行执行的。事实上主线程、A线程、B线程,3个线程的执行是3条并行的流,只不过主线程短一些。
  3. Qt中实现多线程,真的很轻松。

原创内容,禁止转载
王雄 第一次更新于2021.03.06

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值