嵌入式軟件開發(fā)過程中,基本都會用到“延時”,本文分享幾種Qt種延時處理方法。
一、阻塞型延時
阻塞的原理就是:在延時期間,本線程的事件循環(huán)得不到執(zhí)行。
1、QThread類的sleep()
最簡單的延時方法就是使用QThread類的sleep(n)、msleep(n)、usleep(n),這幾個函數(shù)的不良后果就是,GUI會在延時的時間段內失去響應,界面卡死,所以,這三個函數(shù)一般用在非GUI線程中。
QThread::msleep(50);//阻塞延時50ms
2、使用定時器:死等
voidDelay_MSec_Suspend(unsignedintmsec)
{
QTime_Timer=QTime::currentTime().addMSecs(msec);
while(QTime::currentTime()
二、非阻塞延時
原理無非就是利用事件循環(huán),有兩種原理:
1、處理本線程的事件循環(huán)
在等待中,不斷強制進入當前線程的事件循環(huán),這樣可以把堵塞的事件都處理掉,從而避免程序卡死
voidDelay_MSec(unsignedintmsec)
{
QTime_Timer=QTime::currentTime().addMSecs(msec);
while(QTime::currentTime()
2、使用子事件循環(huán)
創(chuàng)建子事件循環(huán),在子事件循環(huán)中,父事件循環(huán)仍然是可以執(zhí)行的
voidDelay_MSec(unsignedintmsec)
{
QEventLooploop;//定義一個新的事件循環(huán)
QTimer::singleShot(msec,&loop,SLOT(quit()));//創(chuàng)建單次定時器,槽函數(shù)為事件循環(huán)的退出函數(shù)
loop.exec();//事件循環(huán)開始執(zhí)行,程序會卡在這里,直到定時時間到,本循環(huán)被退出
}
三、耗時代碼的處理
假設有這樣的應用情景:點擊某個button之后,需要讀入并處理一幅圖像,需要耗時20秒才能處理完。
在這20s內,GUI會失去效應,界面上的任何元素都無法被點擊,這種情況應該怎么辦?方法有兩種:1、用另一個線程去處理這個耗時任務;2、在耗時任務中,不斷地去處理本線程的事件循環(huán),以保證GUI的及時響應。
for(i=0;i1000000;?i++)
{
????//QCoreApplication::AllEvents);????//去處理本線程的事件循環(huán),避免本線程被堵塞
????QCoreApplication::AllEvents,?5);//如果不夠頻繁,可以增加第二參數(shù)來緩解卡頓
?
????for(j=0;j1000000;?j++)
????{
????????//QCoreApplication::AllEvents);//處理事件循環(huán),不建議放在這里,可能過于頻繁
????????doSomeThing();
????}
}
一般來說,processEvents()不宜被調用的過于頻繁,也不宜被調用的不夠頻繁。過于頻繁的話,一方面會使線程的響應更好,但另一方面會導致原本就耗時的任務變得更加耗時;不夠頻繁的話,顯然可能會使GUI線程的響應變差,例如每500ms才被調用一次,那么GUI的事件循環(huán)就只能500ms才被處理一次,當然,這個問題可以通過設定processEvents()的第二個形參略微得到緩解,更好的做法是,保證被調的周期<200ms(再小一些更好,看程序需求),這樣不至于肉眼可見的卡頓。
副作用:(特別注意?。?/p>
1、在點擊按鈕之后,這個20s的耗時任務開始執(zhí)行,尚未執(zhí)行完畢時,我們點擊了GUI的關閉按鈕,那么GUI會立即消失,但是這個耗時任務仍然會在后臺執(zhí)行,直到執(zhí)行完畢,進程才會退出。解決辦法:重寫關閉事件,在關閉事件的函數(shù)中直接結束進程。
2、在點擊按鈕之后,這個20s的耗時任務開始執(zhí)行,執(zhí)行到第5秒時,我們再次點擊了這個按鈕,那么QT又會執(zhí)行一個新的20s任務,這個新任務完成后,又會接著把第一個20s任務從上次被打斷的第5秒繼續(xù)執(zhí)行。如果這個任務是可重入的,后果僅僅是被執(zhí)行了兩遍,如果任務不可重入,那情況就徹底糟糕了。解決辦法:點擊按鈕后把這個按鈕disable掉,執(zhí)行完再enable
審核編輯 :李倩
-
延時
+關注
關注
0文章
107瀏覽量
25535 -
函數(shù)
+關注
關注
3文章
4331瀏覽量
62622 -
嵌入式軟件
+關注
關注
4文章
240瀏覽量
26648
原文標題:幾種延時處理方法
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論