1. 程式人生 > >qt事件迴圈(exec)

qt事件迴圈(exec)

1、事件迴圈一般用exec()函式開啟。QApplicaion::exec()、QMessageBox::exec()都是事件迴圈。其中前者又被稱為主事件迴圈。

事件迴圈首先是一個無限“迴圈”,程式在exec()裡面無限迴圈,能讓跟在exec()後面的程式碼得不到執行機會,直至程式從exec()跳出。從exec()跳出時,事件迴圈即被終止。QEventLoop::quit()能夠終止事件迴圈。

其次,之所以被稱為“事件”迴圈,是因為它能接收事件,並處理之。當事件太多而不能馬上處理完的時候,待處理事件被放在一個“佇列”裡,稱為“事件迴圈佇列”。當事件迴圈處理完一個事件後,就從“事件迴圈佇列”中取出下一個事件處理之。當事件迴圈佇列為空的時候,它和一個啥事也不做的永真迴圈有點類似,但是和永真迴圈不同的是,事件迴圈不會大量佔用CPU資源。

事件迴圈的本質就是以佇列的方式再次分配執行緒時間片。

2、事件迴圈是可以巢狀的,一層套一層,子層的事件迴圈執行exec()的時候,父層事件迴圈就處於中斷狀態;當子層事件迴圈跳出exec()後,父層事件迴圈才能繼續迴圈下去。

另外,子層事件迴圈具有父層事件迴圈的幾乎所有功能。Qt會把事件送到當前生效的那個事件迴圈佇列中去,其中包括Gui的各種事件。所以使用者在主執行緒中執行各種exec()(如QMessageBox::exec(),QEventLoop::exec())的時候,雖然這些exec()打斷了main()中的QApplication::exec(),但是Gui介面仍然能夠正常響應。     3、如果某個子事件迴圈仍然有效,但其父迴圈被強制跳出,此時父迴圈不會立即執行跳出,而是等待子事件迴圈跳出後,父迴圈才會跳出。