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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM