C ++庫提供事件循環的功能來處理事件驅動的應用程序的瞬時事件和計劃的事件
事件循環處理事件,可選地通知註冊接收器
您可以使用事件循環阻止當前線程進行事件處理,或者作為獨立線程,將當前線程免費用於其他任務
注意:此庫為在同一過程中的多線程事件過程提供了一個框架,而沒有任何IPC功能
EventLoop::Mode::BLOCK此事件循環模式將阻止已發出EventLoop::Run()調用的當前線程(通常是主線程)
然後,只要循環運行,當前線程將繼續處理事件
EventLoop::Mode::NON_BLOCK此模式將在另一個線程上運行事件循環,該線程將防止當前線程EventLoop::Run()呼叫已被阻止。
噹噹前線程在同一線程上啟動事件循環後,或者它已經使用其自己的阻止事件循環後,當前線程必須進行某些執行,這可能很有用。後者的一個示例可以是QT Framework的QGuiApplication::exec()呼叫,該呼叫會阻止主線程並開始處理事件
這提出了一個重要的問題:為什麼像QT的exec()這樣的主要循環需要次要事件循環?
我不知道您,但是我非常想念QT活動循環中的某些功能,例如向所有已註冊/訂閱的接收器廣播信號的能力。這是從頭開始開發事件循環庫的主要動機,除了我對事物的工作方式和渴望狗食的瘙癢的好奇心之外,還有一些其他動機!
當您希望應用程序的多個組件對單個刺激作用時,無需將每個接收器與發件人的顯式連接到單個刺激時,廣播是典型的。祝您好運將發件人實例傳遞給多個接收器,並為每個接收器創建一個信號插槽連接,以在QT中啟用廣播接收!
另一個可靠的理由是為整個應用程序創建一個全局事件處理系統,而無需對事件提供商或關聯的發送者和接收器對象進行任何參考,以註冊和触發事件。 EventLoop是一個獨立的靜態類,具有靜態方法,使開發人員能夠從絕對的任何線程中發出API調用,與QT中的任何位置不同,在QT中,發件人和接收器對象需要創建連接和發射信號。
作為用戶,您可以將事件循環庫動態鏈接到您的應用程序,並將EventLoop.h標頭包含在應用程序代碼中以訪問庫方法。由於我們將Event用作自定義類型來交付和接收名稱和數據的事件,因此Event.h將在源文件中需要從傳入事件獲取這些詳細信息
注意:除了上面在您的應用程序中使用庫時,請勿在該項目的包含目錄中包含任何其他標題。要記住的另一種方法是,您只需要應用程序和所有
.hpp文件的.h標頭文件
詳細的API文檔可以在EventLoop.h標題中找到。以下步驟顯示了您的應用程序中事件循環的使用情況:
main()函數中,請致電EventLoop::SetMode()方法,如果您希望循環是非障礙物。無需明確調用以進行阻止模式,因為這是默認模式main()中調用EventLoop::Run()方法,您希望事件循環啟動和/或塊EventLoop::RegisterEvent()在任何類或源文件中接受Event*的註冊回調,您希望在其中通知事件。通常,註冊是在lambdas或類成員作為處理程序的類構造函數中進行的EventLoop::TriggerEvent()在應用程序的任何線程中觸發事件,以及為特定事件名稱註冊的相應處理程序將立即或超時後調用,取決於使用的超載類型Event Type的Event::getName()和Event::getData()方法從已註冊的處理程序中從接收到的事件中檢索信息EventLoop::Halt()方法的明確調用優雅地退出。該方法可以從任一模式中的任何線程調用。如果在註冊處理程序中調用,它將僅在完成處理程序範圍內生效Tip: If you're planning to use
EventLoopon top of Qt'sexec()event loop, set up non-blockingEventLoop::Run()before theexec()call andEventLoop::Halt()to be invoked on theQGuiApplication::aboutToQuitsignal as follows for a graceful exit
QObject::connect(&app, &QGuiApplication::aboutToQuit, []{ EventLoop::Halt(); });
注意:封鎖
EventLoop::Run()在同一線程上呼叫之後,任何代碼都不會執行,直到事件循環停止,因為EventLoop::Run()將當前線程阻止當前線程以設計為“處理事件”。
購物車應用程序是此庫和API的使用參考。如果有任何疑問或澄清,您可以通過[email protected]與我聯繫。
在build.sh Releases中查看庫的最新穩定版本
可以在沒有任何選項的情況下運行腳本。每個選項的默認值將顯示在使用指令中的{}中。通過運行以下命令來了解腳本用法
./build.sh -h
例如,如果要使用Unix Makefiles cmake Generator使用該腳本來構建釋放模式,則可以執行腳本如下
./build.sh -a -r -g "Unix Makefiles"
構建工件將在build目錄”中生成
輸出工件將在lib目錄中以libEventLoop.so
如果您認為,歡迎您為該項目做出貢獻
作為潛在的貢獻者,您可以
如果有任何疑問或建議,請隨意與我聯繫。