如何使用QT5實現多線程(一)


情景模擬

假如我們要統計一個函數的運行時間我們可以用什么方法呢?掐秒表的那位同學請坐下(划掉)

很顯然我們可以通過開辟線程的辦法,函數在一個線程內跑,計時函數在另外一個線程內跑.我們便可以在函數運行的時候統計運行時間(雖然運用某些計時函數能更加准確)

下面就來實現這一構思

多線程的優點

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開發及實例>>

 


免責聲明!

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



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