QThread 的使用方法

2021-06-10 01:20:57 字數 1296 閱讀 9033

20101023更新:qthread 使用**

qthread與qwidget的使用

起源

昨天不小心看到qt開發人員( bradley t. hughes)blog中的一片文章

you are-doing-it-wrong 。 結果看得頭昏腦脹:好歹也自學了近1年的qt,也一直很小心、很認真地閱讀qt和manual和例子等資料,卻被突然告知,qthread的正確使用方法是一種自己從沒見過,而且qt manual、example、書籍中都沒有提到過的一種方法。到底怎麼了...

莫非manual、exmaple以及資料中的介紹都是錯的??

qthread 的兩種使用方法

1. 不使用事件迴圈。這是官方的 manual 、example 以及相關書籍中都介紹的一種的方法。

a. 子類化 qthread

b. 過載 run 函式,run函式內有乙個 while 或 for 的死迴圈

c. 設定乙個標記為來控制死迴圈的退出。

2. 使用事件迴圈。(部落格

you are-doing-it-wrong 批駁的就是這種情況下的 一種用法。)

a. 子類化 qthread,

b. 過載 run 使其呼叫 qthread::exec()

c. 並為該類定義訊號和槽,這樣一來,由於槽函式並不會在新開的 thread 執行,很多人為了解決這個問題在建構函式中呼叫movetothread(this);

而爭論和不解正是這樣的一條語句造成的。

bradley t. hughes 給出說明是:qthread 應該被看做是作業系統執行緒的介面或控制點,而不應該包含需要在新執行緒中執行的**。需要執行的**應該放到乙個qobject的子類中,然後將該子類的物件movetothread到新執行緒中。

另外:

在qt4.3(包括)之前,run 是虛函式,必須子類化qthread來實現run函式。

而從qt4.4開始,

qthreads-no-longer-abstract    ,run 預設呼叫 qthread::exec() 。這樣一來不需要子類化 qthread 了,只需要子類化乙個 qobject 就夠了,這正是被 bradley t. hughes推薦的方法。

終於看懂了,但

不管怎麼說,都應該是 qthread 當初的設計導致的這種問題,而所有文件和例子中都沒有提到該如何使用qthread 進一步加劇了對qthread的這種誤用。

QThread 的使用方法

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

QThread的正確使用方法

qt自帶的文件和例子中使用qthread都是繼承qthread,然後過載run,今天想在繼承自qthread類中自定義乙個槽,覺得對qthread的訊號 槽的機制在多執行緒的情況下有些不清楚的地方,猜想qthread的槽並不是執行在qthread例項建立的子執行緒中,但我需要讓槽執行在子執行緒中,查...

QThread和QTimer的使用方法

說明 1 一下小結不保證對,如果錯誤希望指正 2 queue和direc代表是的connect的鏈結方式,qt directconnection和qt queuedconnection 小結 我想實現的乙個小定時器程式 輸入s start 定時器啟動,列印資訊。輸入e end 定時器停止執行.大概實...