日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt中线程的简单使用

發布時間:2024/9/27 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt中线程的简单使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于線程過去寫的比較少,現在也幾乎是小白的水平。先創建Qt empty project,即Qt空項目,打開QtCreate->文件->新建文件或項目->其它項目->empty qmke project,接著按提示創建Qt空項目,創建之后,在項目上右鍵添加新文件,選擇源文件,創建main.cpp文件,添加如下代碼:
main.cpp

#include <QtCore>int main(int argc,char* argv[]) {QCoreApplication app(argc,argv);return app.exec(); }

再添加新文件,選擇類,基類為QThread,類名為myThread,最后添加代碼后文件內容為:
myThread.h

#ifndef MYTHREAD_H #define MYTHREAD_H#include <QThread>class myThread : public QThread {Q_OBJECT public:explicit myThread(QObject *parent = nullptr); protected:void run(); private: // volatile bool stopped; };#endif // MYTHREAD_H

myThread.cpp

#include "mythread.h" #include "Counter.h" #include <QDebug>myThread::myThread(QObject *parent):QThread(parent) { // stopped = false; }void myThread::run() {Counter counter;quint8 i = 4;while(i--){counter.increment(); // int n = counter.GetValue(); // qDebug()<<QString("n:").arg(counter.GetValue());qDebug()<<"n:"<<counter.GetValue();} }

再添加另一個線程類,同樣在項目上右鍵添加新文件,選擇類,類名mythreadread,基類為QThread,創建好這個類之后,添加完代碼之后,文件內容如下:
mythreadread.h

#ifndef MYTHREADREAD_H #define MYTHREADREAD_H#include <QThread>class mythreadread : public QThread {Q_OBJECT public:explicit mythreadread(QObject *parent = nullptr); protected:void run(); };#endif // MYTHREADREAD_H

mythreadread.cpp

#include "mythreadread.h" #include "Counter.h" #include <QDebug>mythreadread::mythreadread(QObject *parent):QThread(parent) {}void mythreadread::run() {Counter counter;quint8 i = 4;while(i--){counter.decrement();qDebug()<<"n="<<counter.GetValue();} }

以上兩個線程類創建完成之后,在項目上右鍵添加新文件Counter.h,即添加頭文件,添加之后,修改其代碼如下:
Counter.h

#ifndef COUNTER_H #define COUNTER_Hclass Counter { public:Counter():n(0){}void increment(){n++;}void decrement(){n--;}int GetValue()const{return n;}//該函數不能修改類成員變量的值 private:int n; }; #endif // COUNTER_H

現在在main函數中修改代碼如下:
main.cpp

#include <QtCore> #include "mythread.h" #include "mythreadread.h"myThread thread1; mythreadread thread2;int main(int argc,char* argv[]) {QCoreApplication app(argc,argv);//針對各自線程中的特定對象的成員操作,互不影響thread1.start();thread1.wait();thread2.start();thread2.wait();return app.exec(); }

運行程序,結果如下:
n: 1
n: 2
n: 3
n: 4
n= -1
n= -2
n= -3
n= -4
結論:第一個線程啟動后,在其線程函數中創建了Counter的類對象,并循環調用四次Counter類的加計數函數,然后輸出每一次加計數后的值,最后調用wait()函數等待線程的結束,第一個線程結束之后,啟動第二個線程,在該線程中對Counter類的成員變量減計數,并輸出每一次減計數后的值,最后等帶線程二結束之后,主程序關閉。其中有三個點需要注意:

  • 在Counter類的定義中,將函數的聲明與定義放在了同一個文件Counter.h中。需要注意的是,在同一個文件中定義并聲明一個類時,函數的定義不能在該類外,否則會出現錯誤提示,重定義該文件。像下面所寫一樣:
  • #ifndef COUNTER_H #define COUNTER_Hclass Counter { public:Counter():n(0){}int GetValue(); private:int n; }; void Counter::GetValue() {return n; } #endif // COUNTER_H

    這樣在類中定義成員函數,會導致編譯錯誤,只能在類中進行定義。

    #ifndef COUNTER_H #define COUNTER_Hclass Counter { public:Counter():n(0){}int GetValue(){return n;} private:int n; };#endif // COUNTER_H
  • 引入可重入的概念,一個類可以被多個線程使用,但每一次只能是調用該類自己的成員函數或成員變量。上面兩個線程,在run()函數中分別對Counter類的成員函數進行操作,針對的是每一個Counter類自己的成員函數的操作,所以兩個線程之間沒有涉及到數據共享,線程同步等問題,可以線程實際是獨立的。
  • 如果將main.cpp中主函數中的兩個線程的啟動順序變為如下:
  • thread1.start();thread2.start();thread1.wait(); thread2.wait();

    那么程序的運行結果是怎么樣呢?其運行結果如下:
    n: 1
    n= -1
    n: 2
    n= -2
    n: 3
    n= -3
    n: 4
    n= -4
    可以看出,兩個線程幾乎是同時運行的,他們之間并行運行各自的run()函數,在對Counter類操作時,n的初始值都是從0開始,互不影響。
    附加總結:
    創建線程的方法之一是創建一個繼承自QThread的類,引入#include頭文件,在類的聲明的開頭加入Q_OBJECT宏,在類中重寫run()函數,在類定義中對run()函數進行定義,即線程需要做的事情在run()函數中編寫,線程類便創建完成了。線程調用時引入線程所在類的頭文件,在需要線程的地方,定義線程對象,并調用start()函數啟動線程,線程結束的地方可以調用stop()函數停止線程,但在之前最好加上wait()函數等待線程的結束。

    terminate的說明

    terminate并不會立即終止線程,它取決于系統的調度,此外調用這個函數時最好在其后調用一下wait()函數等待線程結束,但是terminate()存在危險性,因為無法知道它在何時會關閉線程,而且關閉線程時不會做清理工作,盡量少用。

    總結

    以上是生活随笔為你收集整理的Qt中线程的简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。