欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Qt每天一例】3.创建一个线程

程序员文章站 2022-05-18 14:41:27
...

需求:创建一个线程并打印

继承QThread

继承QThread来实现一个线程

#include "mainwindow.h"

#include <QApplication>


#include <QtDebug>
class demo:public QThread
{
public:
    demo(){};
    ~demo(){};
    void run() override
    {
        while (true)
        {
            QThread::msleep(1000);
           qDebug()<<QString::asprintf("%x",QThread::currentThreadId())<<"thread";
        }
    }

};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    demo d1;
    d1.start();

    demo d2;
    d2.start();
    return a.exec();
}

QtConcurrent::run创建线程

使用QtConcurrent::run
QtConcurrent编写的程序会根据可用的处理器内核数自动调整使用的线程数

Concurrent是并发的意思,QtConcurrent是一个命名空间,提供了一些高级的 API,使得在编写多线程的时候,无需使用低级线程原语,如读写锁,等待条件或信号。使用QtConcurrent编写的程序会根据可用的处理器内核数自动调整使用的线程数。这意味着今后编写的应用程序将在未来部署在多核系统上时继续扩展。

//首先追加 QT += concurrent
#include "mainwindow.h"

#include <QApplication>


#include <QtDebug>
class demo
{
public:
    demo(){};
    ~demo(){};
    void tick()
    {

        while (true)
        {
            QThread::msleep(1000);
           qDebug()<<QString::asprintf("%x",QThread::currentThreadId())<<"thread";
        }
    }

};

#include <QtConcurrent/QtConcurrentRun>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    demo d1;
        demo d2;

    QtConcurrent::run(d1,&demo::tick);
    QtConcurrent::run(d2,&demo::tick);

    return a.exec();
}

QThreadPool线程池创建线程

优点:无需手动释放资源,QThreadPool启动线程执行完成后会自动释放。
缺点:不能使用信号槽与外界通信。
适用场景:QRunnable适用于线程任务量比较大,需要频繁创建线程。QRunnable能有效减少内存开销。


#include <QApplication>
#include <QRunnable>
#include <QThreadPool>


class Runnable:public QRunnable
{

public:
    Runnable(){};
    ~Runnable(){};
    void run(){
        while (true)
            {
                QThread::msleep(1000);
               qDebug()<<QString::asprintf("%x",QThread::currentThreadId())<<"thread";
            }

    };
};


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Runnable runObj1;
    QThreadPool::globalInstance()->start(&runObj1);
    Runnable runObj2;
    QThreadPool::globalInstance()->start(&runObj2);


    return a.exec();
}