保持Qt程式中GUI的響應流暢

2022-06-19 20:27:12 字數 1186 閱讀 2504

** 

如何使qt 平台中的gui保持響應流暢?一般來說耗時較長的操作,分為計算密集型操作和io密集型操作,對於這兩類操作如何提高響應速度。

而從操作的本質上來說,操作又可分為不可分解操作,如在第三方庫中耗時較長的操作,以及可分解操作,其中可分解操作又可細分為序列操作和可並行操作,如何針對這幾類操作來提高響應速度呢?

如何將非同步的操作,如網路庫中非同步的讀取資料方法,變成同步的操作?

此外對於多執行緒,普遍的看法是可以提供程式的執行速度,其實不然,不正確地使用執行緒常常會使程式變慢,那麼在qt中是否可以通過多執行緒以外的方法來提高響應速度呢?本文給你解決。

首先什麼是對gui的響應?答:gui的響應就是系統對於gui事件的處理速度。

由於系統處理事件需要一定的時間,所以一般視窗系統都會提供乙個事件佇列來儲存事件。如果把每個事件處理看成乙個任務的話,那麼事件處理就類似於作業系統對於任務按照優先順序進行處理,使得每個任務的平均等待時間最小。那麼就可以借鑑一下作業系統中的方法,比如:

分級,讓較長的任務延後執行。

分時,對於較長的任務,讓其執行一段時間後暫停,然後再執行。

減少每個任務執行的耗時,當然這是最基本的方法。

再看分時,它適用於可分解的操作(包括序列操作和並行操作),只需記錄當前任務的執**況,然後可以再次執行。它的使用流程如下:

function eventhandler()  

//註冊系統空閒事件以繼續處理

}

在qt中註冊系統空閒事件的方法可以通過qtimer::singleshot(0, this, slot(calculate()));將系統空閒訊號註冊到自己的槽中。或者使用qmetaobject::invokemethod(this, "calculate", qt::queuedconnection);方法,通過invokemethod非同步的執行某個方法。

最後重點看一下如何減少響應的時間,對於資料密集型操作,推薦使用threadpool來管理,減少執行緒上下文切換的時間;而對於io密集型操作,則自己管理乙個thread來實現,而這也是我認為thread最應該使用的情景,即讓cpu和外設都處於滿負荷運轉狀態,減少總的操作時間。

對於並行操作響應時間的減少,在qt中引入了qt concurrent的概念,採用map/reduce的方式,具體可以參考qt中的concurrent programming節。

*************** end

基於C 的Qt(二)GUI應用程式設計基礎

字尾為 pro 的檔案是專案的管理檔案,檔名就是專案的名稱。專案管理檔案用於記錄專案的一些設定,以及專案包含檔案的組織管理。字尾為 ui 的檔案是視覺化設計的窗體的定義檔案,如widget.ui。雙擊專案檔案目錄樹中的檔案widget.ui,會開啟乙個整合在qt creator中的qt design...

QT中呼叫外部程式的方法

上個月有人寫信問我這個問題,當時做了比較詳細的回答,把回答內容放上來,也許對其它 人會有些用處的吧。有些地方我的理解可能也不正確,歡迎指正 問題 回答 1 完全可以使用fork,execv函式,其實qprocess類只是對這些底層函式的封裝而 已,但是考慮到使用qprocess的話,不需要自己處理程...

QT中呼叫外部程式 QProcess的使用

本文 http blog.csdn.net waderchan archive 2009 05 19 4199913.aspx 執行介面如下 程式共包含以下有乙個檔案 view plain copy to clipboard print?main.cpp include process.h incl...