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

Posted 鱼酱2333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt每天一例3.创建一个线程相关的知识,希望对你有一定的参考价值。

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

继承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();


以上是关于Qt每天一例3.创建一个线程的主要内容,如果未能解决你的问题,请参考以下文章

Qt每天一例13.枚举转字符串

Qt每天一例17.信号槽的一些写法技巧

Qt每天一例5.打印Qt版本

Qt每天一例7.输出当前程序GID

Qt每天一例12.保留两位有效数字

Qt每天一例15.QMap添加操作