Qt使用线程的两种方法

364 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

对于线程的解释:

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。

同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。 一个进程可以有很多线程,每条线程并行执行不同的任务。

在多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。在单CPU单核的计算机上,使用多线程技术,也可以把进程中负责I/O处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的workhorse线程执行密集计算,从而提高了程序的执行效率。

对于QT,下面介绍两种办法实现多线程编程


方法一:使用QThread类 继承QThread类,覆写run函数,使用run方法启动线程,使用wait方法等待线程退出 例子: mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include<QDebug>


class myThread : public QThread
{
    Q_OBJECT
public:
    explicit myThread(int threadId,QObject *parent = 0);
    void run();
    int threadId;
signals:
    
public slots:
    
};

#endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"

myThread::myThread(int threadId,QObject *parent) :
    threadId(threadId),
    QThread(parent)
{
}
void myThread::run(){
    for(int i=0;i<5;i++){
        QThread::msleep(100);

        qDebug()<<"Thread "<<threadId<<" is running,i="<<i;

    }
}

main.cpp

#include <QCoreApplication>
#include <mythread.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    myThread mt(1);
    myThread mt1(2);
    mt.start();
    mt1.start();
    mt.wait();
    mt1.wait();
    return a.exec();
}

运行结果: 在这里插入图片描述


方法二:使用QRunnable 继承QRunnable类,覆写run方法,使用QThreadPool的start方法启动线程,使用waitForDone方法等待线程退出 例子: mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QRunnable>
#include<QThread>
#include<QDebug>

class myThread : public QRunnable
{
    //Q_OBJECT 不是QObject的子类,不需要定义Q_OBJECT
public:
    explicit myThread(int threadId,QObject *parent = 0);
    void run();
    int threadId;
signals:
    
public slots:
    
};

#endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"

myThread::myThread(int threadId,QObject *parent) :
    threadId(threadId)
{
}
void myThread::run(){
    for(int i=0;i<5;i++){
        QThread::msleep(100);

        qDebug()<<"Thread "<<threadId<<" is running,i="<<i;

    }
}

main.cpp

#include <QCoreApplication>
#include<mythread.h>
#include<QThreadPool>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    myThread *mt=new myThread(1);
    myThread *mt1=new myThread(2);
    QThreadPool tp;
    tp.start(mt);
    tp.start(mt1);
    tp.waitForDone();
    return a.exec();
}

运行结果: 在这里插入图片描述