Qt5:多线程处理与使用之二(Qt5的方法)

Qt5:多线程处理与使用之二(Qt5的方法)

特点:使用相对而言复杂,但是比较灵活

 

思路:

Qt5:多线程处理与使用之二(Qt5的方法)_第1张图片

 

项目实例:

Qt5:多线程处理与使用之二(Qt5的方法)_第2张图片  Qt5:多线程处理与使用之二(Qt5的方法)_第3张图片       Qt5:多线程处理与使用之二(Qt5的方法)_第4张图片

 

 

源码交流:

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include 
#include 
#include 

class MyThread : public QObject
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);

    void MyTimeout();//线程处理函数
    void setFlage(bool flag = true);  //设置标志位,何时关闭子线程

signals:
    void MySignal();

public slots:


protected:
    bool isStop;
};

#endif // MYTHREAD_H

 

mythread.cpp

#include "mythread.h"

MyThread::MyThread(QObject *parent) : QObject(parent)
{
    isStop = false;
}

//线程处理函数
void MyThread::MyTimeout()
{
    while(false == isStop)
    {
        QThread::sleep(1);

        emit MySignal();   //每隔一秒发射一次信号
        qDebug()<<"子线程ID:"<

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include 
#include "mythread.h"
#include 
#include 

namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MyWidget(QWidget *parent = 0);
    ~MyWidget();

    void dealMySignal();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void dealClose();

signals:
    void startMyThread();  //启动子线程的信号

private:
    Ui::MyWidget *ui;

    MyThread *myThread;
    QThread *thread;
};

#endif // MYWIDGET_H

mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);

    //创建线程对象,不能够指定父对象
    myThread = new MyThread;
    //创建子线程对象
    thread = new QThread(this);
    //把子线程(对象)添加到自定义的线程类(对象)中
    myThread->moveToThread(thread);

    connect(myThread, &MyThread::MySignal, this, &MyWidget::dealMySignal);
    qDebug()<<"主线程ID:"<lcdNumber->display(i);
}


//启动子线程
void MyWidget::on_pushButton_clicked()
{

    if(thread->isRunning() == true)  //这个判断个什么鬼?
    {
        return;
    }
    //启动子线程,但没有启动线程处理函数
    thread->start();
    myThread->setFlage(false);

    //**************************************************
    //不能够直接调用该线程处理函数
    //不然的话,都会导致线程处理函数和主线程是在同一个线程
    // myThread->MyTimeout();
    //**************************************************


    //只能够通过 signal - slot 来调用线程处理函数
    emit startMyThread();



}

void MyWidget::on_pushButton_2_clicked()
{
    if(thread->isRunning() == false)
    {
        return;
    }
    myThread->setFlage(true);
    thread->quit();
    thread->wait();
}

void MyWidget::dealClose()
{
    on_pushButton_2_clicked();
    delete myThread;  //因为没有指定父对象,所以不释放会溢出,但是没有设么大问题
}

前面还有一篇使用Qt4的方法来写Qt多线程,欢迎大家看

 

 

你可能感兴趣的:(Qt)