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:
转载于//www.cnblogs.com/doker/p/11162586.html
还没有评论,来说两句吧...