實現一個線程開啟時,時間計時器任然能夠計數,兩路獨立工作的線程功能。從類的幫助文件中可以看到如下信息,靜態公共成員函數和保護類型的函數,在靜態函數中有睡眠函數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 }