一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

幾種Qt種延時處理方法

strongerHuang ? 來源:CSDN ? 作者:CSDN ? 2022-05-31 09:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式軟件開發(fā)過程中,基本都會用到“延時”,本文分享幾種Qt種延時處理方法。

一、阻塞型延時

阻塞的原理就是:在延時期間,本線程的事件循環(huán)得不到執(zhí)行。

1、QThread類的sleep()

最簡單的延時方法就是使用QThread類的sleep(n)、msleep(n)、usleep(n),這幾個函數(shù)的不良后果就是,GUI會在延時的時間段內(nèi)失去響應(yīng),界面卡死,所以,這三個函數(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)被退出
}

三、耗時代碼的處理

假設(shè)有這樣的應(yīng)用情景:點擊某個button之后,需要讀入并處理一幅圖像,需要耗時20秒才能處理完。

在這20s內(nèi),GUI會失去效應(yīng),界面上的任何元素都無法被點擊,這種情況應(yīng)該怎么辦?方法有兩種:1、用另一個線程去處理這個耗時任務(wù);2、在耗時任務(wù)中,不斷地去處理本線程的事件循環(huán),以保證GUI的及時響應(yīng)。

for(i=0;ifor(j=0;j

一般來說,processEvents()不宜被調(diào)用的過于頻繁,也不宜被調(diào)用的不夠頻繁。過于頻繁的話,一方面會使線程的響應(yīng)更好,但另一方面會導(dǎo)致原本就耗時的任務(wù)變得更加耗時;不夠頻繁的話,顯然可能會使GUI線程的響應(yīng)變差,例如每500ms才被調(diào)用一次,那么GUI的事件循環(huán)就只能500ms才被處理一次,當然,這個問題可以通過設(shè)定processEvents()的第二個形略微得到緩解,更好的做法是,保證被調(diào)的周期<200ms(再小一些更好,看程序需求),這樣不至于肉眼可見的卡頓。

副作用:(特別注意!)

1、在點擊按鈕之后,這個20s的耗時任務(wù)開始執(zhí)行,尚未執(zhí)行完畢時,我們點擊了GUI的關(guān)閉按鈕,那么GUI會立即消失,但是這個耗時任務(wù)仍然會在后臺執(zhí)行,直到執(zhí)行完畢,進程才會退出。解決辦法:重寫關(guān)閉事件,在關(guān)閉事件的函數(shù)中直接結(jié)束進程。

2、在點擊按鈕之后,這個20s的耗時任務(wù)開始執(zhí)行,執(zhí)行到第5秒時,我們再次點擊了這個按鈕,那么QT又會執(zhí)行一個新的20s任務(wù),這個新任務(wù)完成后,又會接著把第一個20s任務(wù)從上次被打斷的第5秒繼續(xù)執(zhí)行。如果這個任務(wù)是可重入的,后果僅僅是被執(zhí)行了兩遍,如果任務(wù)不可重入,那情況就徹底糟糕了。解決辦法:點擊按鈕后把這個按鈕disable掉,執(zhí)行完再enable

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 延時
    +關(guān)注

    關(guān)注

    0

    文章

    108

    瀏覽量

    25878
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4379

    瀏覽量

    64708
  • 嵌入式軟件
    +關(guān)注

    關(guān)注

    4

    文章

    245

    瀏覽量

    27289

原文標題:幾種延時處理方法

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Linux修改uboot啟動延時方法詳細攻略,觸覺智能RK3568開發(fā)板演示

    本文介紹Linux系統(tǒng)修改uboot啟動延時方法,使用觸覺智能EVB3568鴻蒙開發(fā)板演示,搭載瑞芯微RK3568,四核A55處理器,主頻2.0Ghz,1T算力NPU;支持開源鴻蒙
    的頭像 發(fā)表于 06-06 18:07 ?306次閱讀
    Linux修改uboot啟動<b class='flag-5'>延時方法</b>詳細攻略,觸覺智能RK3568開發(fā)板演示

    技術(shù)分享 | 如何在2k0300(LoongArch架構(gòu))處理器上跑通qt開發(fā)流程

    技術(shù)分享 | 如何在2k0300開發(fā)板(LoongArch架構(gòu))處理器上跑通qt開發(fā)流程
    的頭像 發(fā)表于 05-20 11:05 ?270次閱讀
    技術(shù)分享 | 如何在2k0300(LoongArch架構(gòu))<b class='flag-5'>處理</b>器上跑通<b class='flag-5'>qt</b>開發(fā)流程

    如何在2K0300開發(fā)板上搭建Qt環(huán)境

    近期迅為售后團隊反饋,許多用戶咨詢:2K0300處理器采用了LA264處理器核,若要在該處理器上運行Qt程序,由于架構(gòu)發(fā)生了變化,其使用方法
    的頭像 發(fā)表于 05-16 14:27 ?170次閱讀
    如何在2K0300開發(fā)板上搭建<b class='flag-5'>Qt</b>環(huán)境

    【技術(shù)案例】Qt 環(huán)境部署 - Ubuntu 篇

    什么是Qt?Qt是一個跨平臺C++圖形用戶界面應(yīng)用程序開發(fā)框架,可構(gòu)建高性能的桌面、移動及Web應(yīng)用程序,也可用于開發(fā)非GUI程序,比如控制臺工具和服務(wù)器。Qt是面向?qū)ο蟮目蚣?,使用特殊的代碼生成
    的頭像 發(fā)表于 04-16 17:17 ?458次閱讀
    【技術(shù)案例】<b class='flag-5'>Qt</b> 環(huán)境部署 - Ubuntu 篇

    延時繼電器的工作原理和接線方法

    延時繼電器作為一在電氣系統(tǒng)中廣泛應(yīng)用的控制元件,具有在電路中實現(xiàn)定時閉合或斷開控制的重要功能。通過引入延時功能,對電路系統(tǒng)的精確控制和管理,適應(yīng)不同的應(yīng)用場景和需求,提高生產(chǎn)效率、降低
    的頭像 發(fā)表于 02-07 16:09 ?1383次閱讀

    Qt Group發(fā)布Qt AI Assistant,助力跨平臺UI開發(fā)

    重復(fù)性勞動方面邁出了重要一步。 Qt AI Assistant的核心目標是減少開發(fā)者在UI開發(fā)過程中所面臨的非編碼類重復(fù)性任務(wù)。這些任務(wù)往往繁瑣且耗時,容易讓開發(fā)者陷入低效的工作狀態(tài)。通過引入AI技術(shù),Qt AI Assistant能夠智能地
    的頭像 發(fā)表于 02-07 13:47 ?1096次閱讀

    Qt Group發(fā)布Qt Accelerate,加速數(shù)字產(chǎn)品開發(fā)進程

    Qt Group近日正式推出了Qt Accelerate,這是一款專為快速構(gòu)建數(shù)字應(yīng)用而設(shè)計的解決方案,旨在滿足工業(yè)制造、移動出行、消費類電子等多個領(lǐng)域的需求。 Qt Accelerate基于
    的頭像 發(fā)表于 01-13 11:19 ?586次閱讀

    ADS8588在做多通道采集時,ADS8588在處理輸入信號時有幾十微秒的延時,請問有無解決前端延時方法?

    ADS8588 在做多通道采集時,采樣速率是200KSPS,由于ADS8588內(nèi)部集成的前端在處理輸入的信號有幾十微秒的延時,影響了對采集信號的響應(yīng),達不到我們設(shè)計的ADC處理性能。請問有無
    發(fā)表于 12-10 07:55

    環(huán)路測試方法有哪幾種

    環(huán)路測試(Loop Testing)是一軟件測試方法,它通過在軟件內(nèi)部創(chuàng)建循環(huán)來驗證程序的循環(huán)結(jié)構(gòu)是否正確。這種方法特別適用于測試循環(huán)控制結(jié)構(gòu),如for循環(huán)、while循環(huán)、do-while循環(huán)等
    的頭像 發(fā)表于 09-12 14:35 ?1732次閱讀

    延時開關(guān)改手動開關(guān)怎么接線

    延時開關(guān)和手動開關(guān)是兩不同類型的開關(guān),它們的工作原理和接線方式也有所不同。在某些情況下,我們可能需要將延時開關(guān)改為手動開關(guān),以滿足特定的使用需求。 一、延時開關(guān)和手動開關(guān)的區(qū)別 工作
    的頭像 發(fā)表于 08-19 15:49 ?1558次閱讀

    延時開關(guān)怎么調(diào)時間長短

    延時開關(guān)是一常見的電子控制設(shè)備,廣泛應(yīng)用于各種場合,如照明、空調(diào)、風扇等。它可以根據(jù)用戶的需求,設(shè)定一定的延時時間,實現(xiàn)自動控制。 一、延時開關(guān)的工作原理
    的頭像 發(fā)表于 08-19 15:46 ?4873次閱讀

    延時開關(guān)上l和a是什么意思

    延時開關(guān)是一常見的電子控制元件,廣泛應(yīng)用于各種電子設(shè)備和系統(tǒng)中。它可以實現(xiàn)對電路的自動控制,使電路在一定的延時后自動接通或斷開。在延時開關(guān)的標識中,L和A通常代表不同的意義。 一、
    的頭像 發(fā)表于 08-19 15:45 ?8077次閱讀

    嵌入式QT常見開發(fā)方式有哪些?

    嵌入式QT常見開發(fā)方式有哪些? 嵌入式工程師在學習和使用Qt進行開發(fā)時,常見的幾種開發(fā)方式包括: 1.Qt Widgets編程: 通過C++代碼直接編寫GUI應(yīng)用程序,利用QtWi
    發(fā)表于 08-12 10:05

    斷電延時繼電器的實際應(yīng)用

    斷電延時繼電器作為一常見的電器設(shè)備,在現(xiàn)代生活中有著廣泛的應(yīng)用。它通過控制電路的開關(guān)時間來實現(xiàn)電器設(shè)備的延時關(guān)閉,從而達到省電、安全等目的。以下將結(jié)合多個應(yīng)用實例,詳細闡述斷電延時
    的頭像 發(fā)表于 07-17 16:51 ?2224次閱讀

    產(chǎn)生脈沖信號有幾種方法

    脈沖信號是一在特定時間間隔內(nèi)具有特定幅度的信號,它在電子學、通信、控制等領(lǐng)域有著廣泛的應(yīng)用。產(chǎn)生脈沖信號的方法有很多種,下面將介紹幾種常見的方法。 555定時器產(chǎn)生脈沖信號 555定
    的頭像 發(fā)表于 07-15 10:35 ?3115次閱讀
    產(chǎn)生脈沖信號有<b class='flag-5'>幾種方法</b>