詳解Qt中線程的使用方法
QT中使用線程可以提高工作效率。
要使用線程要經過一下四個步驟:
(1)先創(chuàng)建一個c++ class文件,記得繼承Thread,創(chuàng)建步驟如下:
a、第一步
b、第二步
(2)自定義一個run函數(shù),以后啟動線程的時候,程序就會跳轉到run函數(shù)中
void run();
(3)初始化線程
HDThread mythread = new HDThread();
(4)啟動線程
mythread->start();
下面來看看線程使用的具體列子:
線程頭文件hdthread.h:
#ifndef HDTHREAD_H #define HDTHREAD_H #include <QThread> #include <QLabel> #include <QMutex> class HDTHread : public QThread { public: HDTHread(QMutex* mtex,QObject *parent = 0); void run();//自定義的run函數(shù) void setLabel(QLabel *lb); private: QLabel *label; QMutex *mutex; //互斥鎖 }; #endif // HDTHREAD_H
主函數(shù)的頭文件threadqt.h
#ifndef THREADQT_H #define THREADQT_H #include <QMainWindow> #include <hdthread.h> #include <writefile.h> #include <QMutex> #include <QSemaphore> namespace Ui { class ThreadQt; } class ThreadQt : public QMainWindow { Q_OBJECT public: explicit ThreadQt(QWidget *parent = 0); ~ThreadQt(); //定義靜態(tài)的信號類 static QSemaphore *sp_A; static QSemaphore *sp_B; private slots: void on_pushButton_clicked(); private: Ui::ThreadQt *ui; HDTHread *thread; //hdtread類,里面繼承了線程 WriteFile *writethread; QMutex mutex;//定義互斥鎖類 }; #endif // THREADQT_H
源文件hdthread.cpp:
#include "hdthread.h" #include <QDebug> #include <threadqt.h> HDTHread::HDTHread(QMutex *mtex, QObject *parent):QThread(parent)//構造函數(shù),用來初始化 { this->mutex = mtex; } void HDTHread::setLabel(QLabel *lb) { this->label = lb; } void HDTHread::run() //啟動線程時執(zhí)行的函數(shù) { while(true) { qint64 data = qrand()%1000; //取隨機數(shù) //this->mutex->lock();//上鎖 ThreadQt::sp_A->acquire();//請求信號 this->label->setText(QString::number(data)); sleep(1); ThreadQt::sp_B->release();//釋放信號 //this->mutex->unlock();//解鎖 qDebug()<<"hello Qt"<<data; } }
源文件threadqt.cpp
#include "threadqt.h" #include "ui_threadqt.h" //初始化靜態(tài)變量 QSemaphore *ThreadQt::sp_A = NULL; QSemaphore *ThreadQt::sp_B = NULL; ThreadQt::ThreadQt(QWidget *parent) : QMainWindow(parent), ui(new Ui::ThreadQt) { ui->setupUi(this); //創(chuàng)建信號對象 sp_A = new QSemaphore(1); sp_B = new QSemaphore(0); } ThreadQt::~ThreadQt() { delete ui; } void ThreadQt::on_pushButton_clicked() { thread = new HDTHread(&mutex); //初始化線程 thread->setLabel(ui->label); thread->start();//開啟線程 writethread = new WriteFile(&mutex); writethread->setLabel(ui->label); writethread->start(); }
大家也看到了,此處的線程也用到了互斥鎖(信號量)保證線程讀寫數(shù)據(jù)時不出現(xiàn)錯誤,這里大家可以看一下具體實現(xiàn)的代碼
this->mutex->lock();//上鎖 ThreadQt::sp_A->acquire();//請求信號 this->label->setText(QString::number(data)); sleep(1); ThreadQt::sp_B->release();//釋放信號 this->mutex->unlock();//解鎖
到此這篇關于詳解Qt中線程的使用方法的文章就介紹到這了,更多相關Qt線程內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
數(shù)據(jù)結構課程設計- 解析最少換車次數(shù)的問題詳解
數(shù)據(jù)結構課程設計- 解析最少換車次數(shù)的問題詳解2013-05-05C語言數(shù)據(jù)結構進階之棧和隊列的實現(xiàn)
棧和隊列,嚴格意義上來說,也屬于線性表,因為它們也都用于存儲邏輯關系為 "一對一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨作為一章,做重點講解2021-11-11