Qt_第五天_线程

Qt4的用法:

Qt_第五天_线程_第1张图片

myWidget.ui
Qt_第五天_线程_第2张图片

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include 
#include    //定时器头文件
#include "mythread.h"//线程头文件
namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

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

    void dealTimeout(); //定时器槽函数
    void dealDone();    //线程结束槽函数

private slots:
    void on_pushButton_clicked();

private:
    Ui::MyWidget *ui;

    QTimer* myTimer; // 声明变量
    MyThread* thread;    //线程对象
};

#endif // MYWIDGET_H

mywidget.cpp

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


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

    //只要定时器启动,自动触发timeout()
    connect(myTimer, &QTimer::timeout, this, &MyWidget::dealTimeout);

    //分配空间
    thread = new MyThread(this);

    connect(thread, &MyThread::isDone, this, &MyWidget::dealDone);
    
    //当按下右上角关闭按钮时,触发destroy()
    connect(this, &MyWidget::destroyed, this, [=](){
        //停止线程
        thread->quit();
        //等待线程处理完手头的工作
        thread->wait()
    });


}
 void MyWidget::dealDone()
 {
     qDebug() <<"it is Over";
     myTimer->stop();
 }

 void MyWidget::dealTimeout()
 {
     static int i = 0;
     i++;
     //设置LCD的值
     ui->lcdNumber->display(i);
 }

MyWidget::~MyWidget()
{
    delete ui;
}

void MyWidget::on_pushButton_clicked()
{
    //如果定时器没有工作
    if(myTimer->isActive() == false)
    {
        myTimer->start(100);
    }

   //启动线程,处理数据
    thread->start();

}

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include 

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

protected:
    //线程处理函数
    //不能直接调用,通过start()间接调用
    void run();
signals:
    void isDone();

public slots:
};

#endif // MYTHREAD_H

mythread.cpp
Qt_第五天_线程_第3张图片

Qt_第五天_线程_第4张图片

QT5的用法

Qt_第五天_线程_第5张图片

myWidget.ui
Qt_第五天_线程_第6张图片

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include 
#include "mythread.h"
#include 


namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

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

    void dealSignal();  //槽函数

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

private slots:
    void on_buttonStart_clicked();

    void on_buttonStop_clicked();

private:
    Ui::MyWidget *ui;
    MyThread* myT;
    QThread *thread;
};

#endif // MYWIDGET_H

mywidget.cpp

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

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

    //动态分配空间
    myT = new MyThread;
    //创建子线程
    thread = new QThread(this);
    //把自定义的线程加入到子线程中
    myT->moveToThread(thread);

    connect(myT, &MyThread::mySignal, this, &MyWidget::dealSignal);

    qDebug() << "主线程号:" << QThread::currentThread();

    //用信号和槽机制启动线程处理函数
    connect(this, &MyWidget::startThread, myT, &MyThread::myTimeout);

    connect(this, &MyWidget::destroyed, this, [=](){
        on_buttonStop_clicked();
        delete myT;
    });
    
    //注意事项1:线程内部不允许操作图形界面
    //注意事项2:connect函数第五个参数的作用,连接方式:默认 队列 直接 
    //多线程时才有意义
    //默认的时候
    //如果是多线程,默认使用队列
    //如果是单线程,默认使用直接方式
    //队列:槽函数所在线程和信号接收者一样
    //直接:槽函数所在线程和信号发送者一样
    
    

}

 void MyWidget::dealSignal()  //槽函数
 {
     static int i = 0;
     i ++;
     ui->lcdNumber->display(i);
 }

MyWidget::~MyWidget()
{
    delete ui;
}

void MyWidget::on_buttonStart_clicked()
{
    if(thread->isRunning() == true)
    {
        return ;
    }
    //启动线程,但是没有启动线程处理函数
    thread->start();
    myT->setFlag(false);
    //不能直接调用线程处理函数
    //直接调用导致,线程处理函数和主线程实在同一个线程
    //只能通过信号和曹的机制调用
    emit startThread();

}

void MyWidget::on_buttonStop_clicked()
{
    //
    if(thread->isRunning() == false)
    {
        return ;
    }
    myT->setFlag(true);
    thread->quit();
    thread->wait();
}

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include 

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

    //线程处理函数
    void myTimeout();

    void setFlag(bool flag = true);

signals:
    void mySignal();

public slots:

private:
    bool isStop;
};

#endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"
#include 
#include 

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

void MyThread::myTimeout()  //线程处理函数
{
    while(false == isStop)
    {
        QThread::sleep(1);
        emit mySignal();
        qDebug() << "子线程号:" << QThread::currentThread();

        if(true == isStop)
        {
            break;
        }
    }
}

void MyThread::setFlag(bool flag)
{
    isStop = flag;
}


你可能感兴趣的:(Qt)