情景模擬
假如我們要統計一個函數的運行時間我們可以用什么方法呢?掐秒表的那位同學請坐下(划掉)
很顯然我們可以通過開辟線程的辦法,函數在一個線程內跑,計時函數在另外一個線程內跑.我們便可以在函數運行的時候統計運行時間(雖然運用某些計時函數能更加准確)
下面就來實現這一構思
多線程的優點
1.提高應用程序的響應時間.這對於開發圖形界面的程序尤其重要,當一個操作耗時很長的時候,整個系統都會等待這個操作,程序就不能響應鍵盤鼠標等的操作,而多線程可以將耗時長的操作置於一個新的線程上,避免以上問題
2.使多CPU系統更加有效.當線程數不多於CPU數目時,不同的線程可以在不同的CPU上運行
3改善程序結構.一個既長又復雜的進程可以分為多個線程,成為獨立的運行部分,這樣有利於代碼的理解和維護
具體實現
1.先創建一個帶ui的程序
其中的按鈕按下則開始啟動線程,同時啟動計時
2.添加一個基類為QThread的.h和.cpp文件
#ifndef THREAD_ONE_H #define THREAD_ONE_H #include <QThread> class thread_one : public QThread { Q_OBJECT public: explicit thread_one(QObject *parent = nullptr); protected: void run();//多線程執行的內容將通過重新該虛函數實現 signals: void over(); public slots: }; #endif // THREAD_ONE_H
#include "thread_one.h" thread_one::thread_one(QObject *parent) : QThread(parent) { } void thread_one::run() { sleep(5);//模擬一個時長5s的復雜函數 emit over();//復雜函數結束后發出信號 }
3.在主線程的文件中設置計時器
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QTimer> #include"thread_one.h" namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); void dealclicked(); void dealtimeout(); private slots: void dealover();//處理新線程返回的結束信號 private: Ui::Widget *ui; QTimer *timer; thread_one *thread; }; #endif // WIDGET_H
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { //初始化 ui->setupUi(this); timer = new QTimer(this); thread = new thread_one(this); connect(ui->pushButton,&QPushButton::clicked,this,&Widget::dealclicked);//按下按鈕后執行dealclicked()槽函數 connect(timer,&QTimer::timeout,this,&Widget::dealtimeout);//根據定時器發出的信號更新LCD顯示器的數字 connect(thread,&thread_one::over,this,&Widget::dealover);//當開辟的線程內的復雜函數執行完后,發出over信號,接收到該信號后便停下計時器 } Widget::~Widget() { delete ui; } void Widget::dealclicked() { timer->start(100);//啟動計時器,每0.1秒發出一次信號 thread->start();//QThread 的對象通過start()函數調用線程文件中的run()函數 } void Widget::dealtimeout()//更新LCD顯示器的數字 { static int time = 0; ui->lcdNumber->display(time); time++; } void Widget::dealover()//接收到信號后停下計時器 { timer->stop(); }
上述內容參考<<Qt5開發及實例>>