目錄
- Plugin Life Cycle
Plugin Life Cycle
為了能夠撰寫Qt Creator插件,您必須了解啟動或關閉Qt Creator時,插件管理器所采取的步驟, 本節詳細描述插件所經歷的程序和狀態,
啟動Qt Creator前,設定環境變數QT_LOGGING_RULES為qtc.extensionsystem*=true,可以使能插件相關的除錯日志輸出,啟動后,你就可以獲取有關情況的更多資訊,
啟動Qt Creator時,插件管理器將執行以下操作:
-
在其搜索路徑中查找所有動態庫,并讀取庫元資料,所有沒有元資料和IID不是
org.qt-project.Qt.QtCreatorPlugin的庫都將被忽略,這是加載插件可能失敗的第一處地方,在最壞的元資料格式錯誤的情況下, -
為每個插件創建ExtensionSystem::PluginSpec類的實體,此類是一個容器,包含來自插件規范的所有資訊,并且還跟蹤插件的狀態,您可以通過插件管理器的plugins()函式,或者在插件被加載后,通過插件的pluginSpec()函式,來獲取ExtensionSystem::PluginSpec實體,
-
將插件設定為
Read狀態, -
驗證插件的每個依賴項是否存在并且兼容,有關插件依賴性的更多資訊,請參見Plugin Meta Data,
-
將插件設定為
Resolved狀態, -
將所有插件排序到串列,我們稱為加載佇列,佇列中,插件的依賴插件位于插件之后(但不一定直接緊靠在插件之后),這將確保我們以正確的順序加載和初始化插件,(我:官方檔案有問題,應該是依賴的插件位于插件之前才對,)
-
加載插件庫,并按照加載佇列的順序創建對應的IPlugin實體,此時,將呼叫插件的建構式,被其他插件所依賴的插件先創建,
-
將插件設定為
Loaded狀態, -
按照加載佇列的順序呼叫各個插件的initialize()函式,在初始化函式中,插件應確保所有的匯出介面均已設定,并可供其他插件使用,插件可以假定他們所依賴的插件的匯出介面均已設定好了,例如,
Core插件設定了Core::ActionManager,Core::EditorManager和所有其他公有可用介面,因此其他插件可以請求和使用它們,插件的initialize()函式對于下面來說是一個好地方:
- 在插件管理器的物件池中注冊物件(請參閱The Plugin Manager, the Object Pool, and Registered Objects)
- 載入配置
- 添加新的選單和選單動作
- 連接到其他插件的信號
-
將插件設定為
Initialized狀態, -
以加載佇列的相反順序呼叫所有插件的extensionsInitialized()函式,在extensionsInitialized函式之后,插件應該徹底完成初始化,設定和運行,插件可以假定依賴于它的插件也已徹底完成設定,并且可以完成初始化部分,供其他插件擴展,例如,
Core插件可以假定所有插件均已注冊其動作,并完成動作管理器的初始化, -
將插件設定為
Running狀態,
在啟動結束時,Core插件的Core::ICore發送兩個信號,在Qt Creator UI顯示之前,它先發送coreAboutToOpen(),然后發送coreOpened(),
啟動結束后,Qt Creator的事件回圈運行時,插件管理器將按照加載佇列的相反順序呼叫所有插件的delayedInitialize()函式,呼叫在主執行緒上完成,但相隔幾毫秒的延遲,以確保Qt Creator的回應能力, 在delayInitialize函式中,插件可以執行非關鍵性的初始化,如果在啟動程序中進行,可能會不必要地延遲Qt Creator UI的顯示,
在完成所有延遲的初始化之后,PluginManager將發送initializeDone()信號,
關閉之前,Core插件Core::ICore發送coreAboutToClose()信號, 之后,插件管理器開始按順序關閉:
- 按照加載佇列的順序,呼叫所有插件的aboutToShutdown()函式, 插件應在此處執行一些措施以加快實際關閉的速度,例如斷開本來不需要呼叫的信號, 如果插件需要延遲實際關閉一段時間,例如,如果需要等待外部行程完成干凈的退出,則插件可以從此函式中回傳 ExtensionSystem::IPlugin::AsynchronousShutdown, 這將使插件管理器等待下一步,并保持主事件回圈運行,直到所有請求AsynchronousShutdown的插件都發送了asynchronousShutdownFinished()信號為止,
- 按加載佇列的相反順序,洗掉插件的ExtensionSystem::IPlugin實體,來銷毀所有插件, 此時,將呼叫插件解構式,在釋放記憶體和其他資源后,插件清理干凈自己,
原創造福大家,共享改變世界
獻出一片愛心,溫暖作者心靈
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/14273.html
標籤:其他
