Qt + 第一种线程

流程:

 

工程目录:

mythread.h:

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

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

protected:
    //QThread的虚函数  可以查看QThread的 Protected Functions 部分
    //线程处理函数
    //不能直接调用,通过start()间接调用
    void run();

signals:

    void isDone();

public slots:
};

#endif // MYTHREAD_H

 

 

mywidget.h:

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

#include <QTimer>//定时器头文件

#include "mythread.h"

namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

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

    void dealTimeout();//定时器槽函数

    void dealDone();//线程结束槽函数

    void stopThread();//停止线程槽函数


private slots:
    void on_pushButton_clicked();

private:
    Ui::MyWidget *ui;

    QTimer *myTimer;//声明变量

    MyThread *thread;//线程对象

};

#endif // MYWIDGET_H

 

 

mythread.cpp:

 

#include "mythread.h"

MyThread::MyThread(QObject *parent) : QThread(parent)
{

}

void MyThread::run()
{
    //很复杂的数据处理
    //需要耗时 5 s
    sleep(5);

    emit isDone();
}

 

 

 

mywidget.cpp:

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

/*
 * 当数据处理复杂的时候,就要考虑使用多线程的方式,防止程序出现“无响应”而崩溃
 */
#include <QThread> //当使用sleep时需要使用此头文件
#include <QDebug>



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);

    //在多线程中的槽函数中,尽量使用传统的槽函数,而不使用lambda
    connect(thread,&MyThread::isDone,this,&MyWidget::dealDone);

    //在运行结束的时候,将线程关闭,当按窗口右上角的叉时,窗口触发destroyed()
    connect(this,&MyWidget::destroyed,this,&MyWidget::stopThread);


}

void MyWidget::stopThread()
{
    //停止线程 不建议使用terminate()停止线程的函数,这个函数太暴力,当线程中使用指针的时候,使用容易造成内存错误
    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 (false == myTimer->isActive())
    {
        myTimer->start(100);
    }

//    //定时器启动后,当这里有非常复杂的数据处理  非常耗时的情况时
//    //这里使用sleep函数代表这里程序复杂、运行的时间长

//    QThread::sleep(5);

//    //处理完数据后,关闭定时器
//    myTimer->stop();

//    qDebug()<<"over";

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


}

 

 

ui:

 

posted @ 2019-07-10 11:05  Mr_Song_D  阅读(276)  评论(0)    收藏  举报