Qt5多線程編程的實現(xiàn)
一、線程基礎
1、GUI線程與工作線程
每個程序啟動后擁有的第一個線程稱為主線程,即GUI線程。QT中所有的組件類和幾個相關的類只能工作在GUI線程,不能工作在次線程,次線程即工作線程,主要負責處理GUI線程卸下的工作。
2、數(shù)據(jù)的同步訪問
每個線程都有自己的棧,因此每個線程都要自己的調(diào)用歷史和本地變量。線程共享相同的地址空間。
二、QT多線程簡介
????Qt通過三種形式提供了對線程的支持,分別是平臺無關的線程類、線程安全的事件投遞、跨線程的信號-槽連接。
????Qt中線程類包含如下:
- QThread?提供了跨平臺的多線程解決方案
- QThreadStorage?提供逐線程數(shù)據(jù)存儲
- QMutex?提供相互排斥的鎖,或互斥量
- QMutexLocker?是一個輔助類,自動對?QMutex?加鎖與解鎖
- QReadWriterLock?提供了一個可以同時讀操作的鎖
- QReadLocker與QWriteLocker?自動對QReadWriteLock?加鎖與解鎖
- QSemaphore?提供了一個整型信號量,是互斥量的泛化
- QWaitCondition?提供了一種方法,使得線程可以在被另外線程喚醒之前一直休眠。
三、QThread線程
1、QThread線程基礎
????QThread是Qt線程中有一個公共的抽象類,所有的線程類都是從QThread抽象類中派生的,需要實現(xiàn)QThread中的虛函數(shù)run(),通過start()函數(shù)來調(diào)用run函數(shù)。
????void run()函數(shù)是線程體函數(shù),用于定義線程的功能。
????void start()函數(shù)是啟動函數(shù),用于將線程入口地址設置為run函數(shù)。
????void terminate()函數(shù)用于強制結(jié)束線程,不保證數(shù)據(jù)完整性和資源釋放。
????QCoreApplication::exec()總是在主線程(執(zhí)行main()的線程)中被調(diào)用,不能從一個QThread中調(diào)用。在GUI程序中,主線程也稱為GUI線程,是唯一允許執(zhí)行GUI相關操作的線程。另外,必須在創(chuàng)建一個QThread前創(chuàng)建QApplication(or QCoreApplication)對象。
????當線程啟動和結(jié)束時,QThread會發(fā)送信號started()和finished(),可以使用isFinished()和isRunning()來查詢線程的狀態(tài)。
????從Qt4.8起,可以釋放運行剛剛結(jié)束的線程對象,通過連接finished()信號到QObject::deleteLater()槽。?
????使用wait()來阻塞調(diào)用的線程,直到其它線程執(zhí)行完畢(或者直到指定的時間過去)。
????靜態(tài)函數(shù)currentThreadId()和currentThread()返回標識當前正在執(zhí)行的線程。前者返回線程的ID,后者返回一個線程指針。
要設置線程的名稱,可以在啟動線程之前調(diào)用setObjectName()。如果不調(diào)用setObjectName(),線程的名稱將是線程對象的運行時類型(QThread子類的類名)。
四、簡單實例
1、建立工程

2、設計ui及控件、控件屬性

3、添加工作線程
建立頭文件workthread.h


在右側(cè)添加如下代碼

#include <QThread>
class WorkThread : public QThread
{
Q_OBJECT
public:
WorkThread();
protected:
void run();
};
4、添加workthread.cpp文件

在右側(cè)添加如下代碼:

重寫run()函數(shù)

重寫run()函數(shù)

#include "workthread.h"
#include <QtDebug>
WorkThread::WorkThread()
{
}
void WorkThread::run()
{
while (true)
{
for ( int n = 0; n < 10; n++ )
{
qDebug()<<n<<n<<n<<n<<n<<n<<n<<n;
}
}
}
5、在threaddlg.h中添加如下內(nèi)容:

#include "workthread.h"
#define MAXSIZE 1
public slots:
void slotStart();
void slotStop();
void slotExit();
private:
WorkThread *workThread[MAXSIZE];
?6、在threaddlg.cpp中完成槽函數(shù)功能
connect(ui->startBtn, SIGNAL(clicked(bool)),this, SLOT(slotStart()));
connect(ui->stopBtn, SIGNAL(clicked(bool)),this, SLOT(slotStop()));
connect(ui->exitBtn, SIGNAL(clicked(bool)),this, SLOT(slotExit()));
void threadDlg::slotStart()
{
for ( int i = 0; i < MAXSIZE; i++ )
{
workThread[i] = new WorkThread();
}
for ( int i = 0; i < MAXSIZE; i++ )
{
workThread[i]->start();
}
ui->startBtn->setEnabled(false);
ui->stopBtn->setEnabled(true);
}
void threadDlg::slotStop()
{
for ( int i = 0; i < MAXSIZE; i++ )
{
workThread[i]->terminate();
workThread[i]->wait();
}
ui->startBtn->setEnabled(true);
ui->stopBtn->setEnabled(false);
}
void threadDlg::slotExit()
{
this->close();
}
運行效果

到此這篇關于Qt5多線程編程的實現(xiàn)的文章就介紹到這了,更多相關Qt5多線程 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Cocos2d-x保存用戶游戲數(shù)據(jù)之XML文件是否存在問題判斷方法
這篇文章主要介紹了Cocos2d-x保存用戶游戲數(shù)據(jù)之XML文件是否存在問題判斷方法,請注意代碼中包含大量注釋,需要的朋友可以參考下2014-09-09
Qt 使用 canon edsdk 實現(xiàn)實時預覽的示例代碼
這篇文章主要介紹了Qt 使用 canon edsdk 實現(xiàn)實時預覽的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
C++中putchar與getchar函數(shù)的細節(jié)及運用
C語言提供putchar函數(shù),用于給終端輸出一個字符;getchar函數(shù),可以從終端接收用戶輸入的一個字符,本文給大家分享C++中putchar與getchar函數(shù)的細節(jié)及運用,感興趣的朋友跟隨小編一起看看吧2021-07-07

