Qt 4.7之前线程处理方式:
线程处理方式:
1)主线程运行:
//如果定时器没有工作
if(myTimer->isActive() == false)
{
myTimer->start(100);
}
2)启动线程,处理数据(通过start()方法)
thread->start();
3)定义一个类MyThread,继承自QThread,线程处理函数
protected:
//QThread的虚函数
//线程处理函数
//不能直接调用,通过start()间接调用
void run();
signals:
void isDone();
处理完成之后通知别人
void MyThread::run()
{
//很复杂的数据处理需要耗时5秒
sleep(5);
//告诉别人已经处理完成了
emit isDone();
}
4)线程槽函数结束后将定时器关闭
connect(thread,&MyThread::isDone,this,&MyWidget::dealDone);
5)当窗口右上角X时,窗口触发destroyed,停止线程
connect(this,&MyWidget::destroyed,this,&MyWidget::stopThread);
#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
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QThread>
#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);
//线程槽函数结束后将定时器关闭
connect(thread,&MyThread::isDone,this,&MyWidget::dealDone);
//当窗口右上角X时,窗口触发destroyed
connect(this,&MyWidget::destroyed,this,&MyWidget::stopThread);
}
/*
* 方法
*/
void MyWidget::dealDone()
{
qDebug() << "it is over";
myTimer->stop();//关闭定时器
}
void MyWidget::stopThread()
{
//停止线程
thread->quit();
//等待线程处理完手头工作
thread->wait();
}
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();
}
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = 0);
protected:
//QThread的虚函数
//线程处理函数
//不能直接调用,通过start()间接调用
void run();
signals:
void isDone();
public slots:
};
#endif // MYTHREAD_H
#include "mythread.h"
MyThread::MyThread(QObject *parent) : QThread(parent)
{
}
void MyThread::run()
{
//很复杂的数据处理需要耗时5秒
sleep(5);
//告诉别人已经处理完成了
emit isDone();
}
效果: