QThread 的使用方法(zz)

起源

昨天不小心看到Qt開發人員( Bradley T. Hughes)Blog中的一片文章 you are-doing-it-wrong 。 結果看得頭昏腦脹:好歹也自學了近1年的Qt,也一直很小心、很認真地閱讀Qt和manual和例子等資料,卻被突然告知,QThread的正確使用方法是一種自己從沒見過,而且Qt manual、example、書籍中都沒有提到過的一種方法。到底怎麼了... 

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

認真看看其他的人的評論,總算理清了一點頭緒。所有事情源於 QThread 的事件循環!


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的這種誤用。

相關鏈接:

http://labs.qt.nokia.com/blogs/2010/06/17/youre-doing-it-wrong/
http://labs.qt.nokia.com/blogs/2006/12/04/threading-without-the-headache/
http://labs.qt.nokia.com/blogs/2007/07/05/qthreads-no-longer-abstract/
http://gitorious.org/qthreadhowto/qthreadhowto/trees/master
http://blog.exys.org/entries/2010/QThread_affinity.html
http://thesmithfam.org/blog/2010/02/07/talking-to-qt-threads/
發佈了0 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章