Qt中线程的简单使用
對于線程過去寫的比較少,現在也幾乎是小白的水平。先創建Qt empty project,即Qt空項目,打開QtCreate->文件->新建文件或項目->其它項目->empty qmke project,接著按提示創建Qt空項目,創建之后,在項目上右鍵添加新文件,選擇源文件,創建main.cpp文件,添加如下代碼:
main.cpp
再添加新文件,選擇類,基類為QThread,類名為myThread,最后添加代碼后文件內容為:
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
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
現在在main函數中修改代碼如下:
main.cpp
運行程序,結果如下:
n: 1
n: 2
n: 3
n: 4
n= -1
n= -2
n= -3
n= -4
結論:第一個線程啟動后,在其線程函數中創建了Counter的類對象,并循環調用四次Counter類的加計數函數,然后輸出每一次加計數后的值,最后調用wait()函數等待線程的結束,第一個線程結束之后,啟動第二個線程,在該線程中對Counter類的成員變量減計數,并輸出每一次減計數后的值,最后等帶線程二結束之后,主程序關閉。其中有三個點需要注意:
這樣在類中定義成員函數,會導致編譯錯誤,只能在類中進行定義。
#ifndef COUNTER_H #define COUNTER_Hclass Counter { public:Counter():n(0){}int GetValue(){return n;} private:int n; };#endif // COUNTER_H那么程序的運行結果是怎么樣呢?其運行結果如下:
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中线程的简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 对象复制 反射_利用Java反
- 下一篇: python局部变量含义_Python的