Qt中为自己的程序建立一个消息循环
生活随笔
收集整理的這篇文章主要介紹了
Qt中为自己的程序建立一个消息循环
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
- 一般事件循環(huán)都是由exec()來開啟的,如:
- 事件循環(huán)是一個(gè)無限循環(huán),程序在exec()里面無限循環(huán),能讓跟在exec()后面的代碼得不到運(yùn)行的機(jī)會(huì),直到exec()跳出。從exec()中跳出時(shí),事件循環(huán)會(huì)被終止。QEventLoop::quit()能夠終止事件循環(huán)。事件循環(huán)實(shí)際上類似于一個(gè)事件隊(duì)列,對(duì)列入的事件依次的進(jìn)行處理,當(dāng)時(shí)間做完而事件循環(huán)沒有結(jié)束的時(shí)候,其實(shí)際上比較類似于一個(gè)不占用CPU事件的for(;;)循環(huán)。
- 事件循環(huán)是可以嵌套的,當(dāng)在子事件循環(huán)中的時(shí)候,父事件循環(huán)中的事件實(shí)際上是處于中斷的狀態(tài),當(dāng)子循環(huán)跳出exec()之后才可以執(zhí)行父循環(huán)中的事件。但是此時(shí)并不代表父循環(huán)中的界面響應(yīng)會(huì)被中斷,因?yàn)橥友h(huán)中也會(huì)有父循環(huán)的大部分事件,執(zhí)行QMessageBox::exec(),QEventLoop::exec()的時(shí)候,雖然這些exec()打斷了main函數(shù)中的QApplication::exec(),但是由于GUI界面的響應(yīng)已經(jīng)被包含在子循環(huán)當(dāng)中,所以GUI界面依然能夠得到響應(yīng)。
- 如果某一個(gè)子事件的循環(huán)仍然有效,但是其父循環(huán)被強(qiáng)制跳出,此時(shí)父循環(huán)不會(huì)立即執(zhí)行跳出,而是等待子事件循環(huán)跳出后,父循環(huán)才會(huì)跳出。
如果希望將主線程等待100ms,不能使用sleep來完成這個(gè)過程,那樣會(huì)導(dǎo)致GUI界面停止響應(yīng)。但是利用事件循環(huán)就可以避免這一點(diǎn):
QEventLoop loop; QTimer::singleShot(100,&loop,SLOT(quit())); loop.exec();若在一個(gè)槽函數(shù)中創(chuàng)建一個(gè)對(duì)象如下:
void myDialog:: on_pushButton_clicked() {QDialog dlg;dlg.show(); }此時(shí)我們會(huì)看不到dlg窗口或者是看到窗口一閃而過。因?yàn)槲覀兊膁lg會(huì)因?yàn)槌隽俗饔糜蚨晃鰳?gòu)掉。解決的辦法很簡單。
總結(jié)
以上是生活随笔為你收集整理的Qt中为自己的程序建立一个消息循环的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt中事件循环机制详解
- 下一篇: Apache RocketMQ 安装、测