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

Qt不能在線程函數(shù)操作UI

這篇具有很好參考價(jià)值的文章主要介紹了Qt不能在線程函數(shù)操作UI。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??Qt的官方文檔雖然并沒有明確說明,不能在子線程中操作UI,但是,因?yàn)镼t是事件循環(huán)機(jī)制,所有的UI事件都是在主線程中處理的,如果在子線程中直接操作UI,就會(huì)存在線程安全問題,嚴(yán)重時(shí)候會(huì)使程序掛掉。
??但是有些場(chǎng)景確實(shí)需要在子線程中操作UI怎么辦?以下是幾種常用的解決方案:
??1. 使用信號(hào)槽機(jī)制
??這種方式是當(dāng)子線程中需要對(duì)ui對(duì)象進(jìn)行操作時(shí),發(fā)出一個(gè)信號(hào),在與之連接的槽中處理ui操作。信號(hào)和槽的連接方式必須是BlockingQueuedConnection 或QueuedConnection 的連接方式連接。
??2. 使用自定義event
??在子線程中通過QCoreApplication::postEvent 發(fā)出自定義的event,在對(duì)應(yīng)的ui對(duì)象中重寫customevent中處理自定義的event 。
??3. 使用QMetaObject::invokeMethod()函數(shù)
??該函數(shù)是一個(gè)靜態(tài)函數(shù),可以直接使用,用于調(diào)用對(duì)象的元對(duì)象方法 。該函數(shù)功能很強(qiáng)大,這里是用到了其可以在不同線程之間調(diào)用對(duì)象方法的特性。

??如果是新代碼,可以在程序設(shè)計(jì)之初就處理好子線程與UI操作之間的協(xié)調(diào)處理,這種情況比較好辦,可以使用方法1和方法2進(jìn)行處理。但是如果是維護(hù)歷史代碼,重新做設(shè)計(jì)肯定是不現(xiàn)實(shí)的,所以就需要使用方法3進(jìn)行處理,在子線程中操作UI的代碼段,修改為QMetaObject::invokeMethod函數(shù)調(diào)用,可以做到最小程度的代碼修改,下面給出具體例子:

// 在子線程中調(diào)用
int rowCount = 0;
REPORT_DE_INFO reportInfo;
bool b = QMetaObject::invokeMethod(this, "initTablewidget", Qt::BlockingQueuedConnection, Q_RETURN_ARG(int, rowCount), Q_ARG(REPORT_DE_INFO&, reportInfo));

??參數(shù)說明:
?? 參數(shù)1:調(diào)用對(duì)象指針
?? 參數(shù)2:調(diào)用的方法名
?? 參數(shù)3:連接方式,與信號(hào)槽連接函數(shù)connect的最后一個(gè)參數(shù)相同。對(duì)于這里是維護(hù)歷史代碼的場(chǎng)景,建議使用BlockingQueuedConnection,原來代碼的執(zhí)行邏輯一定是先執(zhí)行完函數(shù)后才繼續(xù)往下走,如果這里不給阻塞住,函數(shù)還沒執(zhí)行完,子線程就會(huì)繼續(xù)往下走,很顯然這與原來的代碼邏輯并不相同,很可能會(huì)出現(xiàn)錯(cuò)誤
?? 參數(shù)4:Q_RETURN_ARG宏,用來接收函數(shù)的返回值,宏的第1個(gè)參數(shù)是返回值類型,第2個(gè)參數(shù)是接收返回值的變量名
?? 參數(shù)5:Q_ARG宏,用來向函數(shù)傳遞參數(shù),宏的第1個(gè)參數(shù)是函數(shù)參數(shù)的類型,第2個(gè)參數(shù)是傳遞參數(shù)的變量名,如果函數(shù)有多個(gè)參數(shù),可以繼續(xù)往下使用Q_ARG宏來傳遞
?? 返回值:bool類型,執(zhí)行成功或者失敗
?? 注意:執(zhí)行的函數(shù)一定要是槽函數(shù),否者回執(zhí)行失敗文章來源地址http://www.zghlxwxcb.cn/news/detail-774874.html

到了這里,關(guān)于Qt不能在線程函數(shù)操作UI的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【Java練習(xí)題匯總】《第一行代碼JAVA》多線程篇,匯總Java練習(xí)題——線程及多線程概念、Thread 類及 Runnable 接口、線程狀態(tài)、synchronized同步操作...

    【Java練習(xí)題匯總】《第一行代碼JAVA》多線程篇,匯總Java練習(xí)題——線程及多線程概念、Thread 類及 Runnable 接口、線程狀態(tài)、synchronized同步操作...

    一、填空題 Java 多線程可以依靠________ 、________ 和________ 三種方式實(shí)現(xiàn)。 多個(gè)線程操作同一資源的時(shí)候需要注意________,依靠________ 實(shí)現(xiàn),實(shí)現(xiàn)手段是:________ 和________,過多的使用,則會(huì)出現(xiàn)________ 問題。 Java 程序運(yùn)行時(shí),至少啟動(dòng)________ 個(gè)線程,分別是________ 和_

    2024年02月16日
    瀏覽(24)
  • 深入探索:在std::thread中創(chuàng)建并管理QEventLoop的全面指南

    深入探索:在std::thread中創(chuàng)建并管理QEventLoop的全面指南

    QEventLoop(事件循環(huán))是Qt框架中的一個(gè)核心組件,它負(fù)責(zé)處理和分發(fā)各種事件,如用戶的鼠標(biāo)點(diǎn)擊、鍵盤輸入等。在Qt中,每個(gè)線程都可以有自己的事件循環(huán),而主線程的事件循環(huán)則由Qt自動(dòng)創(chuàng)建和管理。 QEventLoop的工作原理可以簡(jiǎn)單地理解為一個(gè)無限循環(huán),它會(huì)不斷地檢查是

    2024年02月08日
    瀏覽(22)
  • 【QT多線程一】繼承QThread,重寫run函數(shù)

    Qt有兩種多線程的方法,其中一種是繼承QThread的run函數(shù),另外一種是把一個(gè)繼承于QObject的類轉(zhuǎn)移到一個(gè)Thread里 。 在這里先介紹一下qt多線程的第一種實(shí)現(xiàn)方法,繼承qthread并重寫run函數(shù)。 注意 :QThread只有run函數(shù)是在新線程里的,其他所有函數(shù)都在QThread生成的線程里。如果

    2024年02月14日
    瀏覽(17)
  • QT中的耗時(shí)操作放到子線程中執(zhí)行

    代碼中有sleep的話,如果不放到子線程中執(zhí)行,會(huì)將主線程卡死。 子線程的.h文件 子線程的.cpp文件 調(diào)用的地方的.h文件 調(diào)用的地方的.cpp文件

    2024年02月16日
    瀏覽(17)
  • Qt中UI對(duì)象只能在主線程中操作,那如何在子線程中操作UI呢

    在Qt中,UI對(duì)象只能在主線程中操作,因?yàn)镼t采用了事件循環(huán)機(jī)制,UI事件(如鼠標(biāo)點(diǎn)擊、鍵盤輸入)都是在主線程中處理的。如果在子線程中直接操作UI對(duì)象,會(huì)導(dǎo)致線程安全問題。 如果需要在子線程中操作UI,可以采用信號(hào)槽機(jī)制或者Qt的線程間通信機(jī)制。 Qt中的信號(hào)槽機(jī)制

    2024年02月11日
    瀏覽(20)
  • Java 中創(chuàng)建線程的幾種方式

    Java 中創(chuàng)建線程的幾種方式

    Java 是一種面向?qū)ο蟮木幊陶Z言,它支持多線程編程。多線程編程是指在一個(gè)程序中同時(shí)運(yùn)行多個(gè)線程,這些線程可以并行執(zhí)行,以提高程序的效率和性能。Java 提供了多種創(chuàng)建線程的方法,本文將介紹這些方法以及它們的優(yōu)缺點(diǎn)。 Java 中的 Thread 類是一個(gè)抽象類,我們可以通

    2024年02月09日
    瀏覽(23)
  • QT子線程或自定義類操作訪問主界面UI控件的幾種方法

    QT子線程或自定義類操作訪問主界面UI控件的幾種方法

    ????????QT創(chuàng)建窗體工程,一般在MainWindow或Dialog類里可以直接通過ui指針訪問控件,但是添加新的類后又如何訪問呢,可以通過以下幾種方式: (1)例如有個(gè)自己定義的類CustomClass,在自定義類里包含主界面指針MainWindow * class MainWindow; ? class CustomClass { public: ? ? CustomCla

    2024年02月09日
    瀏覽(23)
  • Python多線程之_thread與threading模塊

    Python多線程之_thread與threading模塊

    Python多線程之_thread與threading模塊 在Python程序中,多線程的應(yīng)用程序會(huì)創(chuàng)建一個(gè)函數(shù),來執(zhí)行需要重復(fù)執(zhí)行多次的程序代碼,然后創(chuàng)建一個(gè)線程執(zhí)行該函數(shù)。一個(gè)線程是一個(gè)應(yīng)用程序單元,用于在后臺(tái)并行執(zhí)行多個(gè)耗時(shí)的動(dòng)作。 在多線程的應(yīng)用程序中,每一個(gè)線程的執(zhí)行時(shí)間

    2024年02月04日
    瀏覽(27)
  • 【Linux操作系統(tǒng)】多線程搶票邏輯——學(xué)習(xí)互斥量(鎖)函數(shù)接口

    【Linux操作系統(tǒng)】多線程搶票邏輯——學(xué)習(xí)互斥量(鎖)函數(shù)接口

    臨界資源 : 多線程執(zhí)行流共享的資源就叫做臨界資源 。 臨界區(qū) :每個(gè)線程內(nèi)部, 訪問臨界資源的代碼,就叫做臨界區(qū) 。 互斥 :任何時(shí)刻, 互斥保證有且只有一個(gè)執(zhí)行流進(jìn)入臨界區(qū),訪問臨界資源,通常對(duì)臨界資源起保護(hù)作用 。 原子性 :不會(huì)被任何調(diào)度機(jī)制打斷的操作

    2024年02月16日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包