Qt多线程实现思路一

  实现一个线程开启时,时间计时器任然能够计数,两路独立工作的线程功能。从类的帮助文件中可以看到如下信心,静态公共成员函数和保护类型的函数,在静态函数中有睡眠函数msleep毫秒级,sleep秒级,usleep微秒级。保护函数中有run虚函数,说明使用时可以重新定义,发生多态,为实现线程任务的关键函数。实现效果如下;在定时器计数时线程的run函数在执行一个5秒的睡眠功能。同步进行

 

mythread.h文件

 1 #ifndef MYTHREAD_H
 2 #define MYTHREAD_H
 3 #include <QThread>
 4 
 5 class myThread : public QThread
 6 {
 7     Q_OBJECT
 8 public:
 9     explicit myThread(QObject *parent = 0);
10 
11 protected:
12     void run();//线程任务在基类QThread为虚函数,从类QThread中继承并重新定义,发生多态
13 signals:
14     void isDone();
15 };
16 
17 #endif // MYTHREAD_H

mythread.cpp文件

 1 #include "mythread.h"
 2 
 3 
 4 myThread::myThread(QObject *parent) : QThread(parent)
 5 {
 6 
 7 }
 8 void myThread::run()
 9 {
10     sleep(5);//线程任务为休眠5秒
11 emit isDone();//休眠5秒结束后触发一个完成信号
12 }
widget.h文件
 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3 #include "mythread.h"
 4 #include <QWidget>
 5 #include <QTimer>
 6 namespace Ui {
 7 class Widget;
 8 }
 9 
10 class Widget : public QWidget
11 {
12     Q_OBJECT
13 
14 public:
15     explicit Widget(QWidget *parent = 0);
16     ~Widget();
17     void dealTimeout();//计时器触发信号
18 private slots:
19     void on_pushButton_clicked();//按钮槽函数
20     void dealDone(); //线程结束槽函数
21     void stopThread(); //停止线程槽函数
22 private:
23     Ui::Widget *ui;
24     QTimer *myTimer;//建一个时间类型的对象指针
25     myThread *MYt;//建一个线程类型的对象指针
26 };
27 
28 #endif // WIDGET_H
widget.cpp文件
 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 #include "mythread.h"
 4 Widget::Widget(QWidget *parent) :
 5     QWidget(parent),
 6     ui(new Ui::Widget)
 7 {
 8     ui->setupUi(this);
 9     myTimer = new QTimer(this);
10     MYt = new myThread(this);
11     connect(myTimer,&QTimer::timeout,this,&Widget::dealTimeout);
//每隔100ms执行的动作 12 connect(MYt,&myThread::isDone,this,&Widget::dealDone);
//线程第二步,当线程完成时,触发线程完成信号 13 connect(this,&Widget::destroyed,this,&Widget::stopThread);
//线程第三步,当窗口关闭时,停止线程 14 } 15 void Widget::dealDone() 16 { 17 myTimer->stop();//计时停止 18 } 19 void Widget::stopThread() 20 { 21 MYt->quit(); 22 MYt->wait(); 23 delete MYt;//释放内存 24 } 25 void Widget::dealTimeout() 26 { 27 static int i = 0; 28 i++; 29 ui->lcdNumber->display(i);//数码管显示当前计数 30 } 31 Widget::~Widget() 32 { 33 delete ui; 34 } 35 36 void Widget::on_pushButton_clicked() 37 { 38 if(myTimer->isActive()==false) 39 { 40 myTimer->start(100);//按下按钮,时间没有开始计时则激活开始计时 41 } 42 MYt->start();//按下按钮启动线程为第一步 43 }
 

猜你喜欢

转载自www.cnblogs.com/fuzhuoxin/p/12157724.html