1. 程式人生 > >對qt多執行緒以及事件投遞的理解

對qt多執行緒以及事件投遞的理解

用QThread啟動執行緒的良好方法以及理解。
1) 用原始的QThread的started訊號觸發自定義的slot啟動執行緒,而不是派生QThread的類過載run函式啟動執行緒。
將一個類派生自QObject,然後實現所有的signal/slot,然後通過呼叫movetothread函式來使他們執行在新的執行緒裡面,而不是每次都要重新派生QThread,並且派生QThread的另外一個不好的地方是隻有run函式內部的程式碼才會執行在新執行緒裡面,相比起來,派生QObject並使用movetothread函式更具有靈活性。
2) 自定義物件moveToThread進執行緒後,事件迴圈可以完全在此執行緒中執行。而它的記憶體管理應該還屬於主執行緒。
如下例子中(MyObject*myObj)被moveToThread進執行緒(QThread*thread)。假如物件MyObject*myObj)有父親,它不能移動這種關係。在另一個執行緒(而不是建立它的那個執行緒)中delete QObject物件是不安全的。除非你可以保證在同一時刻物件不在處理事件。可以用QObject::deleteLater(),它會投遞一個DeferredDelete事件,這會被物件執行緒的事件迴圈最終選取到。
3)exec的重要性。
主執行緒開始它的事件迴圈需要呼叫QCoreApplication::exec(), 子執行緒需要用QThread::exec(),功能基本是一樣的,當然qt內部肯定是不同的實現。
假如沒有事件迴圈執行,事件不會分發給物件。舉例來說,假如你在一個執行緒中建立了一個QTimer物件,但從沒有呼叫過exec(),那麼QTimer就不會發射它的timeout()訊號.對deleteLater()也不會工作。(這同樣適用於主執行緒)。
4) 子執行緒接收事件
a) 如下例子中,子執行緒並不存在exec()函式。原因是exec()函式在QThread的run()中呼叫了。
我們這裡並沒有做一個QThread派生類,在run中呼叫exec()。因為我不推薦怎麼幹。原因很簡單,並不需要這麼幹。進一步說明是:qt提供的QThread已經完全滿足執行緒建立的需要。為什麼還要自己再畫蛇添足呢。
b)本例子真正使用的是QCoreApplication::postEvent,和過載QObject類的customEvent的方法。訊息一樣會在(MyObject*myObj)所在的執行緒處理。
5) 關於QCoreApplication::postEvent和QCoreApplication::sendEvent
postEvent: 可以給別的執行緒傳送事件。事件會在目的物件所屬的執行緒中執行。這是一個非同步介面。
sendEvent: 僅用於同一個執行緒之間傳送事件。目的物件必須與當前執行緒一樣。這是一個同步介面。假如傳送給屬於另一個執行緒的物件,會報錯:ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread a51f48. Receiver '' (of type
 'MyObject') was created in thread a3bf18", file kernel\qcoreapplication.cpp, line 539
以下是結合上述描述的3個檔案。可正常編譯執行。

相關推薦

qt執行以及事件投遞理解

用QThread啟動執行緒的良好方法以及理解。 1) 用原始的QThread的started訊號觸發自定義的slot啟動執行緒,而不是派生QThread的類過載run函式啟動執行緒。 將一個類派生自QObject,然後實現所有的signal/slot,然後通過呼叫movetothread函式來使他們執行在

執行執行以及事件驅動程式設計模型對比

中文版全文:http://blog.csdn.net/hanhuili/article/details/9389433#comments 事件驅動程式設計是一種程式設計正規化,這裡程式的執行流由外部事件來決定。它的特點是包含一個事件迴圈,當外部事件發生時使用回撥機制來

java執行的一些淺淺的理解

     作為一名JAVA初學者,前幾天剛剛接觸多執行緒這個東西,有了些微微的理解想寫下來(不對的地方請多多包涵並指教哈)。      多執行緒怎麼寫程式碼就不說了,一搜一大堆。說說多執行緒我認為最難搞的地方,就是來回釋放鎖以及執行緒等待和喚醒的時機。首先先明確一下wait(

QT執行淘酒,持續更新

第一階段 首先必須區分三個概念: 主執行緒:在程式初始化完成後,主執行緒就進入了main()函式開始執行應用程式碼,一般在主執行緒上構建介面物件並呈現之,然後就進入了事件迴圈以處理各類訊息(控制元件繪製、使用者輸入、系統輸出等訊息)。這就是熟知的事件驅動模型。 工作執行緒:也就是子執

QT執行中,物件訊號與槽連線不上的解決辦法

1、在接收者建立執行緒中,把接收者移動到主執行緒中: pReceiverObj->moveToThread(QApplication::instance()->thread()); 2、這樣傳送訊號的時候,就會在主執行緒事件佇列處理中來處理了。 把connect的最

QT學習記錄2(QT執行

對QT多執行緒的理解 qt多執行緒基於QThread類,在使用的時候,可以選擇新建類,然後繼承QThread類,然後重寫run函式,從而實現QT多執行緒   QT多執行緒小例程 首先,建立一個QT工程,名字叫做mythread,視窗選擇widget,然後一路下一步即可,生成

qt執行之 std::thread

不時見到有人會這樣做: 不使用QThread,而是使用pthread等平臺相關的底層 api 而又不想使用底層執行緒間同步、通訊的api 那麼,如何使用pthread,而又使用Qt提供的執行緒間機制呢? 本文的初衷源於此,但是使用的的是C++0x 的 std::threa

Qt 執行伺服器與客戶端

文章目錄 思路 伺服器 myserver.h myserver.cpp mythread.h mythread.cpp mysocket.h mysocket.cpp

Qt執行同步

       一、Qt中使用多執行緒時候,多執行緒的同步就是一個不可避免的問題。多執行緒的同步就是使多個執行緒在同時執行同一段程式碼的時候,有順序的執行,不會出現同時有兩個或者多個執行緒執行同一段程式碼的情況,特別是在對變數或者檔案執行寫操作的時候。也就是所謂的

Qt執行-QThreadPool執行池與QRunnable

介紹 執行緒的建立及銷燬需要與系統互動,會產生很大的開銷。若需要頻繁的建立執行緒建議使用執行緒池,有執行緒池維護一定數量的執行緒,當需要進行多執行緒運算時將運算函式傳遞給執行緒池即可。執行緒池會根據可用執行緒進行任務安排。 QThreadPool 此類為Qt提供

Qt:語法】Qt執行事件迴圈

        週末天冷,索性把電腦抱到床上上網,這幾天看了 dbzhang800 部落格關於 Qt 事件迴圈的幾篇 Blog,發現自己對 Qt 的事件迴圈有不少誤解。從來只看到現象,這次借 dbzhang800 的部落格,就程式碼論事,因此瞭解到一些 Qt 深層的實現,

QT 執行程式設計

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

單例模式--餓漢(按需建立)、懶漢(執行以及執行下改進)

程式碼註釋有介紹,(排版過於難受,下次用md排完再傳上來) package singleton; /** * @author: ycz * @date: 2018/12/24 0024 22:15 * @description: 懶漢模式 */ public class SingleTon1

Qt執行執行的等待和喚醒】QWaitCondition

QWatiCondition的成員函式 ·QWaitCondition() ·~QWaitCondition() ·bool wait ( QMutex * mutex, unsigned long time = ULONG_MAX ) ·vo

執行執行以及執行安全個人理解

在這裡,我不對多執行緒原理在做闡述。想了解的讀者可以參考:這裡,我將抽象的概念具體化,通過和尚挑水的故事對多執行緒做解釋。1、首先定義和尚類Monkpackage com.stu.thread; /** * 和尚類 * @author jj * */ public

Qt執行學習:建立執行

【為什麼要用多執行緒?】 傳統的圖形使用者介面應用程式都只有一個執行執行緒,並且一次只執行一個操作。如果使用者從使用者介面中呼叫一個比較耗時的操作,當該操作正在執行時,使用者介面通常會凍結而不再響應。這個問題可以用事件處理和多執行緒來解決。 【Linux有執行緒的概念嗎?

QT執行臨界資源互斥

多執行緒是個老梗,一般都會遇到,同樣臨界資源的互斥訪問也是一個老生長談的問題了。這裡把最近使用的一種方法分享一下。 問題場景:主執行緒根據一定條件建立多個子執行緒,子執行緒執行的是同一個類不同例項的方法,該方法中需要向主執行緒傳送一個訊息顯示一個對話方塊用以接收使用者輸入;

Qt執行程式設計

Qt執行緒類 Qt 包含下面一些執行緒相關的類: QThread 提供了開始一個新執行緒的方法 QThreadStorage 提供逐執行緒資料儲存 QMutex   提供相互排斥的鎖,或互斥量 QMutexLocker 是一個便利類,它可以自動對QMut

QT 執行 使用UI

直接上程式碼: qt的ui操作必須在主執行緒做的,分支執行緒只能傳送訊息給主執行緒進行引導操作。 所以平常我們的程式碼都是直接使用一個執行緒來調動UI,但是不同的執行緒同時需要使用UI來顯示結果之類的就需要相互協調; 如果沒有invoke之類的方法,可以考慮直接使用qt 的Qthread

Java的執行以及記憶體模型的知識點梳理,有想到過這些嗎?

JMM大致描述: JMM描述了執行緒如何與記憶體進行互動。Java虛擬機器規範檢視定義一種Java記憶體模型,來遮蔽掉各種作業系統記憶體訪問的差異,以實現Java程式在各種平臺下都能達到一致的訪問效果。 JMM描述了JVM如何與計算機的記憶體進行互動 JMM都是圍繞著原子性,有序性和可見