QTcreator实现多线程 基础学习记录2

QTcreator实现多线程


方法一:Qthread(传统方法)

1、创建线程,需要子类化继承QThread,并实例化线程对象
2、执行线程,需要调用实例化对象的start()函数,它会默认调用run()函数,run()函数执行线程中需要的操作【默认run()通过调用exec()开启事件循环,在线程内运行一个Qt事件循环】,run()函数返回后,线程执行结束

代码示例1:

头文件:
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include 
#include 
#include 
#include 

class MyThread : public QThread
{
    Q_OBJECT
public:
    MyThread(const QString &FilePath, const QByteArray &data)
    {
        File_Path = FilePath;
        data_ = data;
    }
protected:
    void run()  //自定义run()函数
    {
        qDebug()<< "mythread:"<<QThread::currentThread();

        QFile file(File_Path);
        file.open(QIODevice::WriteOnly);
        file.write(data_);

        file.waitForBytesWritten(30*1000);
        //对于缓冲的设备,这个函数等待,直到缓冲的写入数据的有效负载被写入设备
    }
private:
    QString File_Path;
    QByteArray data_;
};
#endif // MYTHREAD_H

源文件:
#include "mythread.h"
#include 

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

    QString FilePath = "e:/thread.txt";
    QByteArray data = "hello pthread!";

    qDebug()<<"main:"<<QThread::currentThread();

    /*若想要启动自己的线程,必须得 实例化线程,再调用start函数 */
    MyThread true_thread(FilePath, data);
    true_thread.start();   //start()默认调用run()函数

    return a.exec();
}
程序实现了利用线程对文件的创建写入操作

方法二:QtConcurrent(高级API,对简单的线程操作来说,代码较为方便)
了解c++11新语法Lambda

#include 
#include 
#include 

int main(int argc, char *argv[])
{
    QCoreApplication b(argc,argv);

    qDebug()<<"main:"<<QThread::currentThread();

    QtConcurrent::run([]()
    {
       qDebug()<<"Qtconcurrent:"<<QThread::currentThread();
    }); //lambda    在新线程中运行
}
运行结果为:可见开辟了新线程
main: QThread(0x97072a8)
Qtconcurrent: QThread(0x970b738, name = "Thread (pooled)")

实现代码示例1,如下:

#include 
#include 
#include 

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

    QString filepath = "e:/concurrent.txt";
    QByteArray data = "concurrent thread!";

    qDebug()<<"main:"<<QThread::currentThread();

    QtConcurrent::run([&filepath,&data]()
    {
       qDebug()<<"main:"<<QThread::currentThread();

       QFile file(filepath);
       file.open(QIODevice::WriteOnly);
       file.write(data);

       file.waitForBytesWritten(30 * 1000);
    }); //lambda    在新线程中运行

    return a.exec();
}
Qt中的线程池  QThreadPool类

用于管理一个qthread集合。QThreadPool管理和封装单个的QThread对象,以帮助在使用线程的程序中降低线程创建成本。

#include 
#include 
#include 

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

    qDebug()<<QThreadPool::globalInstance()->maxThreadCount();

    return a.exec();
}
//利用线程池查看电脑处理器核心数
Qt中的互斥锁	QMutex 

用来保证在任一时刻,只能有一个线程访问该对象(避免对临界资源的竞争)
QTcreator实现多线程 基础学习记录2_第1张图片
尽量在对象的生存线程操作对象;
Ui对象只能在主线程操作;

多线程配合 信号和槽

connect的第五个参数决定线程间信号和槽的通讯方法
常见的三种类型:QTcreator实现多线程 基础学习记录2_第2张图片

你可能感兴趣的:(多线程,qtcreator)