成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Qt 平臺中使GUI保持響應流暢

移動開發
對于響應速度出現的問題,異步傳輸和同步傳輸,多線程息息相關。那么本文將會給你解決你所遇到的問題,詳細內容請看下文

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

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

如何將異步的操作,如網絡庫中異步的讀取數據方法,變成同步的操作?

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

首先什么是對GUI的響應?答:GUI的響應就是系統對于GUI事件的處理速度。

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

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

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

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

先看***個分級,當一個事件處理程序知道自己將執行耗時很長的操作時,可以調用QCoreApplication::processEvents() 方法,等待消息隊列中的方法都執行完再執行。當然這是一個最基本的方法,只適用與簡單的情況,如果事件隊列中的另一程序也調用了該方法則會出現死鎖。

再看分時,它適用于可分解的操作(包括串行操作和并行操作),只需記錄當前任務的執行情況,然后可以再次執行。它的使用流程如下:

  1. Function EventHandler()  
  2.  {  
  3.      //開始計時  
  4.      While(執行時間 < 用戶可接受的響應時間)  
  5.      {  
  6.          //執行操作:     }  
  7.     //注冊系統空閑事件以繼續處理  
  8.  } 

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節。

***再解答下如何在QT中將異步操作改成同步操作的方法,這個就屬于QT special的內容,一般的讀者可以跳過。

具體的代碼如下所示:

  1. QNetworkAccessManager manager;  
  2. QEventLoop q;  
  3. QTimer tT;  
  4.  tT.setSingleShot(true);  
  5.  connect(&tT, SIGNAL(timeout()), &q, SLOT(quit()));  
  6.  connect(&manager, SIGNAL(finished(QNetworkReply*)),  
  7.          &q, SLOT(quit()));  
  8.  QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("http://www.qtcentre.org")));   
  9.  tT.start(5000); // 5s timeout  
  10.  q.exec();    
  11.  if(tT.isActive()){  
  12.     // download complete  
  13.      tT.stop();  
  14. } else {  
  15.      // timeout  
  16.  } 

其中主要利用了QEventLoop類,它將創建一個本地的Event loop,然后block,直到接受到finished信號,或者timeout超時信號后才退出,而事件循環則不會被block。

【編輯推薦】

解析 QT 靜態庫和動態庫

深度解析 QT 編譯安裝方法

用Qt為Symbian開發應用程序

推薦五個***的MySQL GUI工具

QML教程:Qt-Quick六大開源組件

Qt 4使用MySQL的中文問題解決方法

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-09-06 15:53:41

Qt平臺GUI

2010-01-06 14:29:03

Linux操作系統

2010-05-04 13:41:04

Unix平臺

2010-07-22 08:42:04

Eclipse平臺中P

2014-05-09 15:43:39

移動安全Android安全

2010-05-14 14:07:38

VMwareXen

2022-07-05 07:02:59

iOS 系統安卓墓碑機制

2011-09-06 13:31:10

MTK平臺Scatter文件

2011-06-14 13:07:54

Qt 圖片

2010-05-20 13:30:26

MySQL代碼

2010-06-22 16:19:01

Black Berry

2011-09-05 15:09:06

Android平臺Phonegap

2023-10-16 18:51:04

ClickHouse大數據

2010-07-05 16:25:13

IPX SPX協議

2015-12-01 09:02:58

ios界面流暢

2009-05-21 09:12:41

Java開發平臺生命周期管理

2017-12-24 21:53:56

數字化客戶觸點移動應用

2011-06-15 10:08:01

Qt CVS

2011-07-05 15:59:18

Qt 嵌入式 linux

2011-06-14 14:57:06

QT Python GUI
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.四虎.com| 国产精品色| 久久精品一级 | 先锋资源站 | 欧美日韩中 | 亚洲乱码国产乱码精品精的特点 | 国产精品久久久久久久久久久久 | 亚洲精品在线免费观看视频 | 日本精品视频在线观看 | 欧美国产中文 | 99re免费| 精品一区二区三区中文字幕 | av免费网站在线观看 | 日韩精品久久一区 | 欧美一区二 | 日韩中文字幕视频 | 欧美阿v| 亚洲最大av网站 | 亚洲国产欧美一区二区三区久久 | 自拍偷拍在线视频 | 亚洲国产精品久久久 | 久久久久91 | 欧美日在线 | 麻豆精品一区二区三区在线观看 | 日操操 | 日韩中文在线视频 | 综合另类 | 欧美精品成人一区二区三区四区 | 自拍偷拍在线视频 | 亚洲精品视频免费看 | 国产精品一区在线播放 | 日韩中文字幕视频 | 国产精品一区二区免费 | 在线看av的网址 | 色婷婷亚洲国产女人的天堂 | 国产精品视频一区二区三区 | www.亚洲成人网 | 一区二区在线不卡 | 奇米四色影视 | 久久久久久久久毛片 | 日韩精品人成在线播放 |