Qt中的多執行緒程式設計 2

2021-10-21 08:42:11 字數 1744 閱讀 9453

首先,我們得知道qt4.4版本之前,qthread::run()是純虛函式:virtual void run() = 0;qthread::run()僅僅是個宣告,沒有任何屬性,子類是必須完全重寫run()的,這個時候我們也只有這一種建立多執行緒的方法。但是在qt4.4版本之後,qt對qthread::run()做了修改:

virtual

void

run(

)

run()函式就預設呼叫了exec()事件迴圈,使得這第二種建立執行緒的方法得以實現:使用訊號與槽機制,將乙個槽函式作為執行緒的入口函式。方法是這個方法,具體實現的步驟,按照我的經驗總結一些:

在當前類中定義乙個private qthread類物件

在當前類中定義乙個private 的槽函式,這個槽是作為執行緒入口函式,所有需要在新執行緒中實現的操作,都在這裡編寫。

當然就是鏈結訊號與槽了。執行緒的start()的訊號鏈結到這個槽函式。

將當前物件movetothread到定義的執行緒物件。

下面是示例**:

//以下是main.cpp

#include

#include

"qdebug"

#include

"testcl.h"

intmain

(int argc,

char

*ar**)

//以上是main.cpp

//以下是testcl.h

#ifndef testcl_h

#define testcl_h

#include

#include

"qthread"

#include

"qdebug"

class

testcl

:public qobject

;#endif

// testcl_h

//以上是testcl.h

//以下是testcl.cpp

#include

"testcl.h"

testcl::

testcl

(qobject *parent)

:qobject

(parent)

void testcl::

threadstart()

void testcl::

threadterminate()

void testcl::

slotthread()

//以上是testcl.cpp

以上**是使用新的方法建立了執行緒,分別要列印主線程id,兩個類中普通成員函式所在的執行緒id、連線到新執行緒的槽函式的執行緒id,按照我們的理解,我們在main()函式中定義了testcl物件,那麼testcl所有普通成員變數和成員函式都應該與main()函式執行緒保持一致,而槽函式是作為新執行緒入口函式的,執行緒id號肯定與main()函式不一樣。

執行一下,看看結果是否如我們所想:

這個建立執行緒方式能夠實現,得益於qthread::run()中預設呼叫exec();執行緒啟動後,先是執行run()函式中exec(),進入了事件迴圈,訊號與槽機制生效,這個時候發出的started()訊號才能進入槽。

qt官方推薦使用今天的新方式進行執行緒建立。

王雄 第一次更新於2021.03.07

Qt中的多執行緒程式設計

qt中的多執行緒程式設計 qthread 類,該類提供了建立乙個新執行緒以及控制線程執行的各種方法。執行緒是通過 qthread run 過載函式開始執行的 在 qt 系統中,始終執行著乙個gui 主事件執行緒,這個主線程從視窗系統中獲取事件,並將它們分發到各個元件去處理。在 qthread 類中還...

Qt中的多執行緒程式設計

1.業務類 1.1要在子執行緒中處理的業務操作抽象成乙個類 subthreadwork 繼承於qobject 1.2在類subthreadwork中自定義乙個業務處理函式 dosubthreadwork 1.3在類subthreadwork中自宣告訊號 signalsubthreadwork 通過自...

Qt 多執行緒程式設計

qt 多執行緒程式設計 qt通過三種形式提供了對執行緒的支援。它們分別是,一 平台無關的執行緒類,二 執行緒安全的事件投遞,三 跨執行緒的訊號 槽連線。這使得開發輕巧的多執行緒 qt程式更為容易,並能充分利用多處理器機器的優勢。多執行緒程式設計也是乙個有用的模式,它用於解決執行較長時間的操作而不至於...