QT多线程moveToThread使用简单例子

  Qt中我经常是重写QThread中的run函数来实现多线程的使用,今天教大家使用使用比较新的moveToThread 函数来教教大家来编写多线程的例子。

   这个例子我没有使用ui界面编程,只是纯代码输出:

   先看看例子的效果吧:

  QT多线程moveToThread使用简单例子_第1张图片

先看看主函数部分:

#include 
#include 

#include"myt.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    myT mytestThread;

    mytestThread.open();
    QThread::sleep(5);
    mytestThread.close();

    return a.exec();
}

启动线程后,5秒钟后,关闭线程,所以才有上面的结果:

首先我们创建一个  myFirstThread 类继承与 QObject

#ifndef MYFIRSTTHREAD_H
#define MYFIRSTTHREAD_H

#include 

class myFirstThread : public QObject
{
    Q_OBJECT
public:
    explicit myFirstThread(QObject *parent = nullptr);

    void closeThread();
signals:

public slots:
    void startThreadSlot();
private:
    volatile bool isStop;
};

#endif // MYFIRSTTHREAD_H

对应cpp:

#include "myfirstthread.h"
#include 
#include 
myFirstThread::myFirstThread(QObject *parent) : QObject(parent)
{
    isStop = true;
}

void myFirstThread::closeThread()
{
    isStop = false;
}

void myFirstThread::startThreadSlot()
{
    while(1)
    {
        if(isStop == false)
        {
            return;
        }

        qDebug()<<"MyThread::startThreadSlot QThread::currentThreadId()=="<

创建第二个类 myT 类继承与 QObject  (这里说明下,如果你创建是界面工程的话,可以把这个写到对应界面的类中)

#ifndef MYT_H
#define MYT_H

#include 
#include "myfirstthread.h"
#include 
class myT : public QObject
{
    Q_OBJECT
public:
    explicit myT(QObject *parent = nullptr);

    void open();
    void close();

signals:

public slots:
    void openThreadSlot();
    void closeThreadSlot();
    void finishedThreadSlot();
private:
    myFirstThread * firstThread;
    QThread * thread;
};

#endif // MYT_H

 对应的cpp

#include "myt.h"
#include
myT::myT(QObject *parent) : QObject(parent)
{
    //
    qDebug() << tr("开始线程了");
    firstThread = new myFirstThread;
    thread = new QThread(this);
    firstThread->moveToThread(thread); //将创建的对象移到线程容器中
    connect(thread,&QThread::finished,firstThread,&myFirstThread::deleteLater); //删除
    connect(thread,&QThread::started,firstThread,&myFirstThread::startThreadSlot); //开启线程
    connect(thread,&QThread::finished,this,&myT::finishedThreadSlot); //完成
}

void myT::open()
{
    openThreadSlot();
}

void myT::close()
{
    closeThreadSlot();
}

void myT::openThreadSlot()
{
    thread->start();
    qDebug() << "mainWidget QThread::currentThreadId()=="<isRunning())
    {
        firstThread->closeThread(); //关闭线程  这里调用关闭
        thread->quit();  //退出循环事件
        thread->wait();  //释放线程槽函数资源
    }
}

void myT::finishedThreadSlot()
{
   qDebug() << tr("触发了函数finished 123");
}

这样就是最后的结果了,你懂了吗,喜欢的可以关注哟。

参考:

https://blog.csdn.net/gongjianbo1992/article/details/85929958

https://blog.csdn.net/naibozhuan3744/article/details/81201502

 

 

 

 

你可能感兴趣的:(QT5.9)