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

Qt程序進入等待睡眠的正確方法

移動開發
Qt程序運行的時候等待一段時間, 這段時間里可能程序什么都不做,也可能是在后臺開了個子線程在做一些用戶看不見的工作。當我們使用使用類似linux提供的”sleep”或”usleep”函數時很容易造成用戶無法與程序交互,本文將告訴你一個正確的方法。

51CTO編者按:Qt框架是Symbian應用程序開發和MeeGo應用程序開發的主要框架,我們在編寫Qt程序時經常會遇到這樣的需求: 讓程序等待一段時間, 這段時間里可能程序什么都不做, 也可能是在后臺開了個子線程在做一些用戶看不見的工作。

首先我們容易想到的方法是使用類似linux提供的”sleep”或”usleep”函數。 但用過這組函數的Qter都知道, 這組函數會將你當前的線程/進程變為“睡眠”狀態。 這個“睡眠”是深度意義的睡眠, 睡眠期間內核不會分配給程序時間片, 所以程序什么都不做, 更不用提界面的刷新了。 直接導致的問題就是用戶無法與程序交互。 所以說直接使用sleep函數睡眠是常見的錯誤方案之一。

另外一種更常見的錯誤方法是使用QTimer+死循環。 類似下面的代碼:

  1. QTimer t; 
  2. t.start(); 
  3. while(t.elapsed() < 250); 

這個簡單粗暴的解決方案也是行不通的。 從代碼中我們可以發現在while循環中不停的調用elapsed()函數, 等于在這段時間內CPU完全沒有機會做別的什么事情。 特別是在Linux這樣非搶占式的操作系統中, 這樣的死循環造成的影響是致命的, CPU被完全占用, 內核都沒有機會調度進程, 別的程序拿不到時間片執行, 系統基本上就是癱瘓狀態了。 無論如何, 這種結果都不是我們想要的。(當然拉, 除非你想寫的是病毒程序。) 對于我們的程序本身, 雖然它占用了所有的CPU, 但由于它陷入該循環, 程序沒有機會進入到GUI事件循環, 導致同樣界面是無法刷新的。

其實把上面的代碼稍加改變就能得到一個很好的解決方案。 第一步, 解決界面無法刷新的問題。 調用QCoreApplication::processEvents(), 代碼如下:

  1. QTimer t; 
  2. t.start(); 
  3. while(t.elapsed() < 250
  4. QCoreApplication::processEvents(); 

第二步, 解決程序CPU占用率過高的問題 -- 讓程序適當睡眠。

  1. QTimer t; 
  2. t.start(); 
  3. while(t.elapsed() < 250
  4. QCoreApplication::processEvents(); 
  5. usleep(10000);//sleep和usleep都已經obsolete,建議使用nanosleep代替 

這里設置程序睡眠一段很短很短的時間, 對于用戶來說是不會有什么感覺的, 但對內核來說就意義大不同。 這樣內核就有充足的時間調度進程/線程, 讓其他程序有機會執行。

在Qt里其實是提供了類似的API的, 只是不在core或gui庫里, 而是在QTestLib中。 參考下面的文檔:http://doc.qt.nokia.com/4.6/qtest.html#qWait

這個函數是專為Qt測試提供, 所以不建議直接使用在Qt程序中。 不過它的基本實現差不多就是我們上面列出的代碼, 很簡單, copy paste到程序里用就好了。

Phone Club——51CTO移動開發線下技術沙龍

活動日期:1月15日
本期主題:Android應用開發技術進階
地點:北京市海淀區中關村南大街30號東聯藝術工社
演講講師:范懷宇(網易)

【編輯推薦】

  1. QTreeWidget設計解決沒有拖動項問題
  2. Symbian和MeeGo將統一開發環境 Qt壓力很大
  3. QtCreator:MeeGo開發程序入門手冊
  4. 諾基亞發布Qt 4.6版本 支持多點觸摸和手勢輸入
  5. 在QT SDK下構建MeeGo Touch開發環境

 

責任編輯:佚名 來源: cuteqt
相關推薦

2010-08-06 13:20:00

DB2鎖等待

2011-09-08 15:29:29

Windows7睡眠模式

2010-09-02 16:40:15

SQL刪除

2021-10-25 22:26:31

Windows 11Windows微軟

2010-08-02 17:30:30

DB2鎖等待

2010-09-29 15:20:29

2010-02-26 08:59:10

WCF服務宿主程序

2010-03-05 16:51:01

Python程序轉為E

2010-05-04 10:39:28

Oracle MTS

2021-11-18 22:41:27

Windows 10Windows微軟

2014-04-18 10:18:15

2020-07-23 11:23:51

存儲備份數據

2020-02-04 14:25:29

云遷移云計算云平臺

2009-12-07 18:57:17

PHP讀取Cookie

2010-05-21 12:35:03

IIS Lockdow

2013-06-08 14:38:03

移動移動互聯網Qt

2010-07-22 14:31:13

Microsoft S

2015-07-13 11:32:09

PHP程序員正確姿勢

2023-10-26 07:54:27

JCStress工具

2011-06-29 16:50:17

Qt 顯示寬字符
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 婷婷丁香在线视频 | 九九爱这里只有精品 | av一区二区三区在线观看 | 国产精品欧美一区二区 | 欧美一级黄色片免费观看 | 91视频观看 | 日韩精品久久久 | 久久精品国产亚洲夜色av网站 | 日韩中文一区二区三区 | 亚洲精品电影网在线观看 | 一区在线视频 | 欧美日韩黄色一级片 | 一级黄色毛片a | 久久伊人一区二区 | 中文字幕二区 | 日本黄色大片免费 | 久久最新 | 最新日韩在线 | 四虎在线观看 | 免费av电影网站 | 玖玖在线精品 | h视频免费在线观看 | 麻豆av一区二区三区久久 | 日韩视频在线免费观看 | 亚洲乱码国产乱码精品精的特点 | 99re国产视频 | 亚洲欧洲国产视频 | 国产精品久久久久久婷婷天堂 | 日本黄色一级片视频 | 国产精品精品视频一区二区三区 | 天天操天天干天天爽 | 欧美一级黄色片 | 91精品国产色综合久久 | 一级高清免费毛片 | 蜜桃av一区二区三区 | 国产999精品久久久久久 | 无码一区二区三区视频 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 日韩成人在线网站 | 久久精品视频一区二区三区 | 天堂视频一区 |