Linux系統下QT中的多線程編程

來源:互聯網
上載者:User

Qt 作為一種基於 C++ 的跨平台 GUI 系統,能夠提供給使用者構造圖形化使用者介面的強大功能。為了滿足 使用者構造複雜圖形介面系統的需求,Qt 提供了豐富的多線程編程支援。

Qt 作為一種基於 C++ 的跨平台 GUI 系統,能夠提供給使用者構造圖形化使用者介面的強大功能。為了滿足 使用者構造複雜圖形介面系統的需求,Qt 提供了豐富的多線程編程支援。從 2.2 版本開始,Qt 主要從下 面三個方面對多線程編程提供支援:一、構造了一些基本的與平台無關的線程類;二、提交使用者自訂事 件的 Thread-safe 方式;三、多種線程間同步機制,如訊號量,全域鎖。這些都給使用者提供了極大的方 便。不過,在某些情況下,使用定時器機制能夠比利用 Qt 本身的多線程機制更方便地實現所需要的功能 ,同時也避免了不安全的現象發生。本文不僅對 Qt 中的多線程支援機制進行了討論,還著重探討了利用 定時器機制類比多線程編程的方法。

1、系統對多線程編程的支援

不同的平台對 Qt 的多線程支援方式是不同的。當使用者在 Windows 作業系統上安裝 Qt 系統時,線程 支援是編譯器的一個選項,在 Qt 的 mkfiles 子目錄中包括了不同種類編譯器的編譯檔案,其中帶有 - mt 尾碼的檔案才是支援多線程的。

而在 Unix 作業系統中,線程的支援是通過在運行 configure 指令檔時添加 -thread 選項加入的 。安裝過程將建立一個獨立的庫,即 libqt-mt,因此要支援多線程編程時,必須與該庫連結(連結選項 為-lqt-mt),而不是與通常的 Qt 庫(-lqt)連結。

另外,無論是何種平台,在增加線程支援時都需要定義宏 QT_THREAD_SUPPORT(即增加編譯選項- DQT_THREAD_SUPPORT)。在 Windows 作業系統中,這一點通常是在 qconfig.h 檔案中增加一個選項來實 現的。而在 Unix 系統中通常添加在有關的 Makefile 檔案中。

2、Qt中的線程類

在 Qt 系統中與線程相關的最重要的類當然是 QThread 類,該類提供了建立一個新線程以及控制線程 啟動並執行各種方法。線程是通過 QThread::run() 重載函數開始執行的,這一點很象 Java 語言中的線程類 。在 Qt 系統中,始終運行著一個GUI 主事件線程,這個主線程從視窗系統中擷取事件,並將它們分發到 各個組件去處理。在 QThread 類中還有一種從非主事件線程中將事件提交給一個對象的方法,也就是 QThread::postEvent()方法,該方法提供了 Qt 中的一種 Thread-safe 的事件提交過程。提交的事件被 放進一個隊列中,然後 GUI 主事件線程被喚醒並將此事件發給相應的對象,這個過程與一般的視窗系統 事件處理過程是一樣的。值得注意的是,當事件處理過程被調用時,是在主事件線程中被調用的,而不是 在調用QThread::postEvent 方法的線程中被調用。比如使用者可以從一個線程中迫使另一個線程重畫指定 地區:

  QWidget *mywidget;
  QThread::postEvent(mywidget, new QPaintEvent(QRect(0,0,100,100)));

然而,只有一個線程類是不夠的,為編寫出支援多線程的程式,還需要實現兩個不同的線程對共有數 據的互斥訪問,因此 Qt 還提供了 QMutex 類,一個線程在訪問臨界資料時,需要加鎖,此時其他線程是 無法對該臨界資料同時加鎖的,直到前一個線程釋放該臨界資料。通過這種方式才能實現對臨界資料的原 子操作。

除此之外,還需要一些機制使得處於等待狀態的線程在特定情況下被喚醒。QWaitCondition 類就提供 了這種功能。當發生特定事件時,QWaitCondition 將喚醒等待該事件的所有線程或者喚醒任意一個被選 中的線程。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.