国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

QT 不阻塞線程,達(dá)到延時的作用

這篇具有很好參考價值的文章主要介紹了QT 不阻塞線程,達(dá)到延時的作用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

有時候需要處理一些跟界面無關(guān)的但非常耗時的事情,這些事情跟界面在同一個線程中,由于時間太長,導(dǎo)致界面無法響應(yīng),處于“假死”狀態(tài)。例如:在應(yīng)用程序中保存文件到硬盤上,從開始保存直到文件保存完畢,程序不響應(yīng)用戶的任何操作,窗口也不會重新繪制,從而處于“無法響應(yīng)”狀態(tài),這是一個非常糟糕的體驗 。
? ? ?在這種情況下,有一種方法是使用多線程,即在子線程中處理文件保存,主線程負(fù)責(zé)界面相關(guān)。
? ? ?而如果不想使用多線程,最簡單的辦法就是在文件保存過程中頻繁調(diào)用QApplication::processEvents()。該函數(shù)的作用是讓程序處理那些還沒有處理的事件,然后再把使用權(quán)返回給調(diào)用者。

Qt一般使用QThread::sleep()來延時,但是這樣會阻塞住線程

此時,可以用

QTime delayTime = QTime::currentTime().addMSecs(3000);?? ?//在當(dāng)前時間上增加3S
/* lyh delete -> 避免有拉拽小票沖突 */
while( QTime::currentTime() < delayTime)
?? ?QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
還有另外一種方法,更加簡潔,但是本質(zhì)是一樣的,利用QEventLoop

QEventLoop loop;
QTimer::singleShot(100, &loop, SLOT(quit()));
loop.exec();

場景——run函數(shù):
寫多線程的時候,可以從QThread派生一個線程類,而且要重寫run函數(shù)。重寫run函數(shù)的時候,底部要加一個exec()事件循環(huán)。

void MyThread::run()
{
? ? //希望在線程中完成的操作...
?
? ? exec();//事件循環(huán)
}
跟main函數(shù)一樣,這里必須寫事件循環(huán),否則run函數(shù)執(zhí)行完前面代碼之后會直接結(jié)束,線程就結(jié)束了。

這里穿插一個概念,所謂線程,不是new了一個線程對象就是線程,這個線程對象其實是在父線程中,跟其它對象一樣,new了一個實例而已。它僅僅存在于父線程,它可以作為控制線程的句柄。而真正的線程過程,是run函數(shù)啟動以后,寫在run函數(shù)中的代碼。所以使用繼承QThread并重寫run函數(shù)的方式實現(xiàn)線程時,一定切記,不是所有函數(shù)就一定會在線程中執(zhí)行,除非它被run函數(shù)調(diào)用,或者在run當(dāng)中使用rambda寫匿名槽函數(shù)。而寫匿名槽函數(shù)的時候,接收者千萬別寫this,this指針是指向父線程的線程對象,能作為句柄控制線程,但this隸屬于父線程。所以一旦寫了this是接收者,這個匿名槽函數(shù)會在父線程執(zhí)行。而子線程中創(chuàng)建對象時,也不要指定parent為this。

所以,在run函數(shù)中寫exec,它會阻止run函數(shù)結(jié)束,讓子線程始終等待消息隊列的任務(wù),從而實現(xiàn)利用信號槽進(jìn)行線程通信。

場景——子線程對象
上面說過線程的實現(xiàn),離不開父線程的線程對象,它僅僅是子線程的操作句柄。如果一定要讓一個槽函數(shù)運行于子線程中,可能還少不了要寫個對象再使用movetothread讓它進(jìn)入線程。所以,個人認(rèn)為,寫線程的時候,更好的方法是不要繼承QThread并重寫run函數(shù)。而是把要執(zhí)行的邏輯寫成一個類,實例化以后movetothread,可以確保它一定是在子線程中運行。

MyObject *obj = new MyObject;
QThread *thd = new QThread;
obj->setParent(NULL);
obj->moveToThread(thd);
thd->start();文章來源地址http://www.zghlxwxcb.cn/news/detail-477968.html

到了這里,關(guān)于QT 不阻塞線程,達(dá)到延時的作用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 為什么有時候ADSL訪問速度會很慢

    ? 為什么有時候ADSL訪問速度會很慢 ? ? ? ?1.網(wǎng)卡綁定的協(xié)議太多。上網(wǎng)速度慢,在局域網(wǎng)用戶中很常見,原因是網(wǎng)卡綁定的協(xié)議太多。網(wǎng)卡上如果綁定了許多協(xié)議,當(dāng)數(shù)據(jù)通過網(wǎng)卡時,計算機就要花費很多時間來確定這個數(shù)據(jù)使用哪種協(xié)議來傳送,這時用戶就會感覺上網(wǎng)慢

    2024年02月08日
    瀏覽(96)
  • M330左鍵有時候按下沒反應(yīng)的解決 - 換微動

    羅技M330鼠標(biāo)左鍵有時候按下沒反應(yīng),原因是微動老了要換新的了。 1、電烙鐵/錫條(最主要的是這兩個,其他可以不需要,操作電烙鐵時候一定要小心,不要碰到被燙到) 2、小號螺絲刀,給眼鏡用的那種,用來拆鼠標(biāo)的螺絲(共2個螺絲) 視頻教程: https://www.bilibili.com/vi

    2024年02月09日
    瀏覽(100)
  • 在Android Studio導(dǎo)入一個項目之后,通常需要下載Gradle的相應(yīng)版本,但是AS的自動下載很慢,有時候甚至?xí) 霈F(xiàn)類似Error:connect time out等錯誤...

    在Android Studio導(dǎo)入一個項目之后,通常需要下載Gradle的相應(yīng)版本,但是AS的自動下載很慢,有時候甚至?xí)?。會出現(xiàn)類似Error:connect time out等錯誤...

    用Android Studio導(dǎo)入一個項目時,用Gradle構(gòu)建過程中報錯誤,估計是下載gradle.zip文件時訪問不到,應(yīng)該是被墻了,網(wǎng)速太慢,下載不了外網(wǎng)資源。錯誤有如下情況:1、加載過慢2、下載超時3、下載失敗 解決方法如下: 1、下載對應(yīng)的gradle版本 在Project的視圖下,找到gradle,里面的

    2024年02月03日
    瀏覽(104)
  • Qt QQueue 安全的多線程隊列、阻塞隊列

    Qt QQueue 安全的多線程隊列、阻塞隊列

    在C++中,queue是一個模板類,用于實現(xiàn)隊列數(shù)據(jù)結(jié)構(gòu),遵循先進(jìn)先出的原則。 ? 常用方法: · ? 簡單使用: · ? 打?。?· QQueue 繼承與 QList ? 常用方法: · ? 實例: · ? 打?。?· 在多線程編程中,由于QQueue并不是線程安全的,因此我們需要先使用互斥鎖(QMutex)來保

    2024年02月16日
    瀏覽(23)
  • 空閑任務(wù)與阻塞延時(筆記)

    空閑任務(wù)與阻塞延時(筆記)

    軟件延時是讓CPU等待達(dá)到延時效果。 而RTOS的優(yōu)勢是可以充分發(fā)揮CPU的性能,永遠(yuǎn)不會讓CPU閑著。 RTOS中的延時叫做阻塞延時 當(dāng)沒有其他任務(wù)可以運行時,RTOS會為CPU創(chuàng)建一個空閑任務(wù),然后CPU去執(zhí)行。 在RTOS中,空閑任務(wù)是系統(tǒng)在調(diào)度器創(chuàng)建的優(yōu)先級最低的任務(wù),空閑任務(wù)主

    2024年02月03日
    瀏覽(18)
  • verilog的非阻塞賦值、延拍和電路延時

    verilog的非阻塞賦值、延拍和電路延時

    1.時序電路使用非阻塞賦值,always塊中的語句順序無影響; 2.非阻塞賦值中d和out的新值在本次上升沿計算之后,下一次上升沿才會生效; 阻塞賦值會使信號變化立即生效 3.實際電路中,下一次上升沿值生效時會有一定觸發(fā)器延時(上一拍采數(shù)時,往左邊偏一點采值)。

    2024年03月24日
    瀏覽(21)
  • 【HAL庫】STM32CubeMX開發(fā)----非阻塞延時實驗----SysTick(滴答定時器)中斷

    【HAL庫】STM32CubeMX開發(fā)----非阻塞延時實驗----SysTick(滴答定時器)中斷

    STM32CubeMX 下載和安裝 詳細(xì)教程 【HAL庫】STM32CubeMX開發(fā)----STM32F103/F207/F407----目錄 HAL庫 有自帶的 ms級 延時函數(shù): HAL_Delay(); 缺點: 這是 阻塞延時 方式,就是延時期間,什么都不能干,這樣很浪費資源。 這篇文章主要介紹,利用 SysTick(滴答定時器)中斷 實現(xiàn) 非阻塞延時 的實驗

    2024年02月16日
    瀏覽(100)
  • 線程池的一個BUG導(dǎo)致CPU達(dá)到100%

    給大家分享一個關(guān)于 ScheduledExecutorService 線程池的 BUG 啊,這個 BUG 能直接把 CPU 給飚到 100%,希望大家永遠(yuǎn)踩不到。 但是,有一說一,一般來說也很難踩到。 到底咋回事呢,讓我給你細(xì)細(xì)說說。 Demo

    2024年02月16日
    瀏覽(15)
  • 10.阻塞隊列和線程池

    阻塞隊列(BlockQueue) 非阻塞方法 add 往滿的隊列中添加元素會報錯 remove 從空的隊列中移除元素會報錯 offer 往滿的隊列中添加元素會返回false poll 從空的隊列中移除元素會返回null 阻塞方法 put take 使用場景: 阻塞隊列通常使用在生產(chǎn)者消費者設(shè)計模式當(dāng)中,生產(chǎn)者不用關(guān)心生成的

    2024年02月04日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包