QThread類的使用

2021-08-27 05:32:45 字數 3613 閱讀 8212

概述

#ifndef myclass_h

#define myclass_h

#include

#include

class myclass : public qthread

;#endif // myclass_h

myclass.cpp檔案:

#include

"myclass.h"

#include

myclass::myclass(qobject *

parent) : qthread(parent)

void myclass::run()

//傳送結束訊號

emit mythreadsignal(count);

exec();

}

main.cpp檔案:

#include "myclass.h"

#include

#include

int main(int argc, char *argv)

執行結果:

結果證明main函式與run函式不在乙個執行緒中。myclass在主線程中,所以得出的結論:繼承自qthread類的物件的建立,與run函式的執行不屬於同乙個執行緒。

2.connect函式的連線方式

直接連線:qt::qt::directconnection

發出訊號所在的執行緒,如果與接收對線所在的執行緒不屬於同一執行緒,採用直接連線的方式,槽函式會在發出訊號所在的執行緒執行。

舉例說明:

myclass類中增加訊號函式:

signals:

void mythreadsignal(const int);

新增controller類

contoller.h檔案:

#ifndef controller_h

#define controller_h

#include

class controller : public qobject

;#endif // controller_h

controller.cpp檔案:

#include

"controller.h"

#include

#include

controller::controller(qobject *

parent) : qobject(parent)

void controller::handleresults()

main.cpp檔案:

int main(int argc, char *argv)

2.qobject::movetothread()方法

注意:自己定義的類一定要繼承qobject類同樣在這裡,寫乙個例子來演示一下:

work.h:

#ifndef worker_h

#define worker_h

#include

class worker : public qobject

;#endif // worker_h

work.cpp

#include "worker.h"

#include

#include

worker::worker(qobject *parent) : qobject(parent)

void worker::dowork(int parameter)

//傳送結束訊號

emit resultready(parameter);

}

controller.h

#ifndef controller_h

#define controller_h

#include

class controller : public qobject

;#endif // controller_h

controller.cpp:

#include

"controller.h"

#include

#include

controller::controller(qobject *

parent) : qobject(parent)

void controller::handleresults(int value)

main.cpp

int main(int argc, char *argv)

**分析:物件w和物件c的建立都是在主線程中的,物件c的訊號發射也是在主線程中,但是槽函式的執行確是在子執行緒中,所以證明movetothread函式是將槽函式的執行放到了子執行緒中。

執行結果如下:

注意一點就是,connect的連線方式,若採用直接連線的方式,槽函式的執行與訊號傳送者所在的執行緒有關。

movetothread方法將worker物件的事件迴圈全部交由qthread物件處理。

3.runnable的方法:

繼承自qobject和qrunnable,qthreadpool;

這裡也寫個例子舉例說明一下:

runnable.h:

#ifndef runnable_h

#define runnable_h

#include

#include

class runnable : public qobject,public qrunnable

;#endif // runnable_h

runnable.cpp

#include "runnable.h"

#include

#include

runnable::runnable()

void runnable::run()

}

main.cpp

int main(int argc, char *argv)

**分析:

run函式部分在子執行緒中執行,在這裡測試這段程式的時候遇到乙個小插曲,執行程式的時候總是報乙個錯誤:

error: 『staticmetaobject』 is not a member of 『qrunnable』,反覆幾次也不得其解,後來上網搜給出的答案是繼承的順序問題,大家如果遇到此問題時,可以檢視一下自己寫的類繼承其他類順序是否有問題。(可能我在建立時,先繼承了qobject類,新增時只能接著在其後面新增繼承,以前沒有意識到這也有先後順序)。

QThread的使用總結

bradley t.hughes 認為 qthread 應該被看做是作業系統執行緒的介面或控制點,而不應該包含需要在新執行緒中執行的 需要執行的 應該放到乙個qobject的子類中,然後將該子類的物件movetothread到新執行緒中。public slots void emitsig signa...

QThread 的使用方法

20101023更新 qthread 使用 qthread與qwidget的使用 起源 昨天不小心看到qt開發人員 bradley t.hughes blog中的一片文章 you are doing it wrong 結果看得頭昏腦脹 好歹也自學了近1年的qt,也一直很小心 很認真地閱讀qt和man...

QThread 的使用方法

1.不使用事件迴圈。這是官方的 manual example 以及相關書籍中都介紹的一種的方法。a.子類化 qthread b.過載 run 函式,run函式內有乙個 while 或 for 的死迴圈 c.設定乙個標記為來控制死迴圈的退出。2.使用事件迴圈。部落格 you are doing it ...