前言:
为什么要使用线程
什么时候用线程
复杂的数据处理
头文件.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTimer>//定时器头文件
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void dealTimeout();//定时器槽函数
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
QTimer *myTimer;//声明变量
};
#endif // WIDGET_H
.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include <QThread>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
myTimer=new QTimer(this);
//只要定时器启动,自动触发timeout()
connect(myTimer,&QTimer::timeout,this,&Widget::dealTimeout);
}
void Widget::dealTimeout()
{
static int i =0;
i++;
//设置LCD的值
ui->lcdNumber->display(i);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
//如果定时器没有工作
if(myTimer->isActive()==false)
{
myTimer->start(100);
}
//非常复杂的数据处理,耗时较长
QThread::sleep(5);
//处理完数据,关闭定时器
myTimer->stop();
qDebug()<<"over";
}
现象
忘了录,而且不好展示,当按下start按键的时候,整个页面会卡住,不可移动和点击,LCD也没有变化,5秒后打印"over"
流程
添加QThread文件
添加新文件
注意基类选择object
.h和.cpp文件改基类和头文件
运行检查是否有错
QThread F1查询 Protected Function
protected:
//QThread的虚函数
//线程处理函数
//不能直接调用,通过start()间接调用
void run();
QThread的使用
mythread.h 线程头文件
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr);
protected:
//QThread的虚函数
//线程处理函数
//不能直接调用,通过start()间接调用
void run();
signals:
void isDone();
};
#endif // MYTHREAD_H
mythread.cpp 线程主文件
#include "mythread.h"
MyThread::MyThread(QObject *parent) : QThread(parent)
{
}
void MyThread::run()
{
//很复杂的数据处理
//需要耗时5s
sleep(5);
emit isDone();
}
widget.h主窗口头文件
添加了线程头文件,线程槽函数,线程停止函数,线程对象
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTimer>//定时器头文件
#include "mythread.h"//线程头文件
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void dealTimeout();//定时器槽函数
void dealDone();//线程槽函数
void stopThread();//停止线程槽函数
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
QTimer *myTimer;//声明变量
MyThread *thread;//线程对象
};
#endif // WIDGET_H
widget.cpp 主窗口主文件
#include "widget.h"
#include "ui_widget.h"
#include <QThread>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
myTimer=new QTimer(this);
//只要定时器启动,自动触发timeout()
connect(myTimer,&QTimer::timeout,this,&Widget::dealTimeout);
//分配空间
thread = new MyThread(this);
connect(thread,&MyThread::isDone,this,&Widget::dealDone);
//当按窗口右上角x时,窗口触发destroyed()信号
connect(this,&Widget::destroyed,this,&Widget::stopThread);
}
void Widget::stopThread()
{
//停止线程
thread->quit();
//等待线程处理完手中工作
thread->wait();
}
void Widget::dealDone()
{
qDebug()<<"it is over";
myTimer->stop();
}
void Widget::dealTimeout()
{
static int i =0;
i++;
//设置LCD的值
ui->lcdNumber->display(i);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
//如果定时器没有工作
if(myTimer->isActive()==false)
{
myTimer->start(100);
}
//启动线程,处理数据
thread->start();
}
现象
5秒停止,打印"it is over"