Qt中线程的简单使用
對(duì)于線程過去寫的比較少,現(xiàn)在也幾乎是小白的水平。先創(chuàng)建Qt empty project,即Qt空項(xiàng)目,打開QtCreate->文件->新建文件或項(xiàng)目->其它項(xiàng)目->empty qmke project,接著按提示創(chuàng)建Qt空項(xiàng)目,創(chuàng)建之后,在項(xiàng)目上右鍵添加新文件,選擇源文件,創(chuàng)建main.cpp文件,添加如下代碼:
main.cpp
再添加新文件,選擇類,基類為QThread,類名為myThread,最后添加代碼后文件內(nèi)容為:
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();} }再添加另一個(gè)線程類,同樣在項(xiàng)目上右鍵添加新文件,選擇類,類名mythreadread,基類為QThread,創(chuàng)建好這個(gè)類之后,添加完代碼之后,文件內(nèi)容如下:
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();} }以上兩個(gè)線程類創(chuàng)建完成之后,在項(xiàng)目上右鍵添加新文件Counter.h,即添加頭文件,添加之后,修改其代碼如下:
Counter.h
現(xiàn)在在main函數(shù)中修改代碼如下:
main.cpp
運(yùn)行程序,結(jié)果如下:
n: 1
n: 2
n: 3
n: 4
n= -1
n= -2
n= -3
n= -4
結(jié)論:第一個(gè)線程啟動(dòng)后,在其線程函數(shù)中創(chuàng)建了Counter的類對(duì)象,并循環(huán)調(diào)用四次Counter類的加計(jì)數(shù)函數(shù),然后輸出每一次加計(jì)數(shù)后的值,最后調(diào)用wait()函數(shù)等待線程的結(jié)束,第一個(gè)線程結(jié)束之后,啟動(dòng)第二個(gè)線程,在該線程中對(duì)Counter類的成員變量減計(jì)數(shù),并輸出每一次減計(jì)數(shù)后的值,最后等帶線程二結(jié)束之后,主程序關(guān)閉。其中有三個(gè)點(diǎn)需要注意:
這樣在類中定義成員函數(shù),會(huì)導(dǎo)致編譯錯(cuò)誤,只能在類中進(jìn)行定義。
#ifndef COUNTER_H #define COUNTER_Hclass Counter { public:Counter():n(0){}int GetValue(){return n;} private:int n; };#endif // COUNTER_H那么程序的運(yùn)行結(jié)果是怎么樣呢?其運(yùn)行結(jié)果如下:
n: 1
n= -1
n: 2
n= -2
n: 3
n= -3
n: 4
n= -4
可以看出,兩個(gè)線程幾乎是同時(shí)運(yùn)行的,他們之間并行運(yùn)行各自的run()函數(shù),在對(duì)Counter類操作時(shí),n的初始值都是從0開始,互不影響。
附加總結(jié):
創(chuàng)建線程的方法之一是創(chuàng)建一個(gè)繼承自QThread的類,引入#include頭文件,在類的聲明的開頭加入Q_OBJECT宏,在類中重寫run()函數(shù),在類定義中對(duì)run()函數(shù)進(jìn)行定義,即線程需要做的事情在run()函數(shù)中編寫,線程類便創(chuàng)建完成了。線程調(diào)用時(shí)引入線程所在類的頭文件,在需要線程的地方,定義線程對(duì)象,并調(diào)用start()函數(shù)啟動(dòng)線程,線程結(jié)束的地方可以調(diào)用stop()函數(shù)停止線程,但在之前最好加上wait()函數(shù)等待線程的結(jié)束。
terminate的說明
terminate并不會(huì)立即終止線程,它取決于系統(tǒng)的調(diào)度,此外調(diào)用這個(gè)函數(shù)時(shí)最好在其后調(diào)用一下wait()函數(shù)等待線程結(jié)束,但是terminate()存在危險(xiǎn)性,因?yàn)闊o法知道它在何時(shí)會(huì)關(guān)閉線程,而且關(guān)閉線程時(shí)不會(huì)做清理工作,盡量少用。
總結(jié)
以上是生活随笔為你收集整理的Qt中线程的简单使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 对象复制 反射_利用Java反
- 下一篇: fmc接口定义_STM32接口FSMC/