QT 事件與事件循環

事件與信號的區別

      事件是針對於應用中的一個具體的目標對象,該對象決定了我們應該如何處理這個事件;而信號的發射是漫無目的的。所有的事件實例是QEvent的子類,且所有的QObject的派生類可以重載虛函數QObject::event()以實現對目標對象實例事件的處理。

      事件可以產生於應用程序的內部,也可以源於外部,比如QKeyEvent代表了與鍵盤的交互事件,來自於視窗體管理程序.....一個重要的事件並不會在產生時就立即被派發,而是列入到一個事件隊列(Event queue)中,等待某一個時刻再發送。這個分發過程由分配器(dispatcher)處理,它會遍歷事件隊列,將入棧的事件發送到其對應的目標對象中,故它們被稱作事件循環(event loop)

 

阻塞事件循環

      QT 的主體事件循環通過運行QCoreApplication::exec()進入,直至QCoreApplication::exit()或者QCoreApplication::quit()被調用纔會結束這一事件循環。

      例如一個按鈕的click信號綁定了一個對象的槽函數,而該槽函數中做了許多耗時的事情。則當我們點擊button之後,當對象在繁忙的工作,處理槽函數中的耗時事情時,整個應用程序的事件循環被阻塞了,它只能等待event handler返回後才能繼續分發其他的事件。

 

如何才能不阻塞事件循環?

    1、將耗時任務移至一個新的獨立線程

    2、強制事件循環

          (1)調用QCoreApplication::processEvents()人工強迫事件循環運行,它會處理所有事件隊列中的事件並返回給調用者

          (2)調用QEventLoop::exec()重入事件循環

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章