學習筆記之————QThread使用方法。

來源:互聯網
上載者:User

此博文轉自:http://hi.baidu.com/cyclone/blog/item/5fac3bc7ab1b90d1d10060f2.html

很好,特此收藏。學習。共勉。

 

 

 起源

昨天不小心看到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/

 

class MyThread : public QThread { public :      MyThread()      {          moveToThread( this );      }         void run();    signals:      void progress( int );      void dataReady( QByteArray );    public slots:      void doWork();      void timeoutHandler(); };

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.