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

2021-06-26 08:18:44 字數 1335 閱讀 7544

qt程式執行的時候等待一段時間, 這段時間裡可能程式什麼都不做,也可能是在後台開了個子執行緒在做一些使用者看不見的工作。當我們使用使用類似linux提供的」sleep」或」usleep」函式時很容易造成使用者無法與程式互動,本文將告訴你乙個正確的方法。

51cto編者按:qt框架是symbian應用程式開發和meego應用程式開發的主要框架,我們在編寫qt程式時經常會遇到這樣的需求: 讓程式等待一段時間, 這段時間裡可能程式什麼都不做, 也可能是在後台開了個子執行緒在做一些使用者看不見的工作。

首先我們容易想到的方法是使用類似linux提供的」sleep」或」usleep」函式。 但用過這組函式的qter都知道, 這組函式會將你當前的執行緒/程序變為「睡眠」狀態。 這個「睡眠」是深度意義的睡眠, 睡眠期間核心不會分配給程式時間片, 所以程式什麼都不做, 更不用提介面的重新整理了。 直接導致的問題就是使用者無法與程式互動。 所以說直接使用sleep函式睡眠是常見的錯誤方案之一。

另外一種更常見的錯誤方法是使用qtimer+死迴圈。 類似下面的**:

qtimer t; 

t.start(); 

while(t.elapsed() <

250); 

這個簡單粗暴的解決方案也是行不通的。 從**中我們可以發現在while迴圈中不停的呼叫elapsed()函式, 等於在這段時間內cpu完全沒有機會做別的什麼事情。 特別是在linux這樣非搶占式的作業系統中, 這樣的死迴圈造成的影響是致命的, cpu被完全占用, 核心都沒有機會排程程序, 別的程式拿不到時間片執行, 系統基本上就是癱瘓狀態了。 無論如何, 這種結果都不是我們想要的。(當然拉, 除非你想寫的是病毒程式。) 對於我們的程式本身, 雖然它占用了所有的cpu, 但由於它陷入該迴圈, 程式沒有機會進入到gui事件迴圈, 導致同樣介面是無法重新整理的。

qtimer t; 

t.start(); 

while(t.elapsed() <

250) 

第二步, 解決程式cpu佔用率過高的問題 -- 讓程式適當睡眠。

qtimer t; 

t.start(); 

while(t.elapsed() <

250) 

這裡設定程式睡眠一段很短很短的時間, 對於使用者來說是不會有什麼感覺的, 但對核心來說就意義大不同。 這樣核心就有充足的時間排程程序/執行緒, 讓其他程式有機會執行。

在qt裡其實是提供了類似的api的, 只是不在core或gui庫里, 而是在qtestlib中。 參考下面的文件:

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

Qt程式等待 睡眠的正確方法

我們在編寫qt程式時經常會遇到這樣的需求 讓程式等待一段時間,這段時間裡可能程式什麼都不做,也可能是在後台開了個子執行緒在做一些使用者看不見的工作。首先我們容易想到的方法是使用類似linux提供的 sleep 或 usleep 函式。但用過這組函式的qter都知道,這組函式會將你當前的執行緒 程序變...

如何讓Qt 的程式等待一段時間1

qtime t t.start while t.elapsed 1000 不停地處理事件,以使得程式保持響應。qthread sleep 1 在while 1 死迴圈裡加上這個,cpu沒空去幹其他的事情,在多程序的情況下會影響其他程式的啟動 響應速度測試的乙個小例子 class widget pub...

如何讓Qt 的程式等待一段時間2

在qt程式中,我們有時候會遇到這樣的需求,比如讓程式暫停 休息 休眠 一段時間。最開始我需要這樣的需求時候,我第一反應想到的是在qt assistant 中搜尋sleep方法,企圖尋找讓程式暫停 休眠一段時間的方法,不過,搜尋結果顯然令我很失望,並沒有找到直接滿足需求的sleep方法,不過看到了qt...