实现一个线程开启时,时间计时器任然能够计数,两路独立工作的线程功能。从类的帮助文件中可以看到如下信心,静态公共成员函数和保护类型的函数,在静态函数中有睡眠函数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 }
原文:https://www.cnblogs.com/fuzhuoxin/p/12157724.html