Životni ciklus dodatka
Da biste pisali C++-bazirane dodatke za Qt Creator, morate razumjeti korake koje upravitelj dodataka poduzima pri pokretanju ili zaustavljanju Qt Creator. Ovaj odjeljak detaljno opisuje proces i stanja kroz koja dodaci prolaze.
Za više informacija o tome što se događa pri pokretanju Qt Creator, pokrenite ga s okolišnom varijablom QT_LOGGING_RULES postavljenom na qtc.extensionsystem*=true, što omogućuje zapisivanje debug izlaza vezanih uz dodatke.
Kada pokrenete Qt Creator, upravitelj dodataka radi sljedeće:
- Pretražuje svoje putanje pretraživanja za sve dinamičke biblioteke i čita njihove metapodatke. Sve biblioteke bez metapodataka i sve biblioteke bez IID-a
org.qt-project.Qt.QtCreatorPlugin-a se zanemaruju. Ovo je prva točka u kojoj učitavanje dodatka može ne uspjeti u najgorem slučaju neispravnih metapodataka. - Stvara instancu klase ExtensionSystem::PluginSpec za svaki dodatak. Ova klasa je spremnik za sve informacije iz specifikacije dodatka i dodatno prati stanje dodatka. Instance klase ExtensionSystem::PluginSpec možete dobiti putem funkcije plugins() upravitelja dodataka.
- Postavlja plugine u stanje
Read. - Provjerava da ovisnosti svakog dodatka postoje i da su kompatibilne. Za više informacija o ovisnostima dodataka pogledajte Meta-podatke dodatka.
- Postavlja dodatke u stanje
Resolved. - Sortira sve dodatke u popis koji nazivamo redoslijedom učitavanja, gdje se ovisnosti dodatka postavljaju nakon samog dodatka (ali ne nužno odmah nakon njega). Time se osigurava da dodatke učitamo i inicijaliziramo u ispravnom redoslijedu.
- Učitava biblioteke dodataka i stvara njihove instance IPlugina redoslijedom iz reda za učitavanje. U tom trenutku pozivaju se konstruktori dodataka. Dodaci na koje drugi dodaci ovise stvaraju se prvo.
- Postavlja dodatke u stanje spremni za učitavanje (
Loaded). - Poziva funkcije initialize() svih dodataka redoslijedom iz reda za učitavanje. U funkciji
initialize, dodatak bi trebao osigurati da su svi izvozni sučelja postavljeni i dostupni drugim dodacima. Dodatak može pretpostaviti da su dodaci na koje ovisi postavili svoja izvozna sučelja. Na primjer, dodatakCorepostavlja sučelja Core::ActionManager, Core::EditorManager i sva druga javno dostupna sučelja, tako da ih drugi dodaci mogu zatražiti i koristiti.Funkcija initialize() plugina je dobro mjesto za
- registriranje objekata u bazen objekata upravitelja dodataka (vidi Upravitelj dodataka, bazen objekata i registrirani objekti)
- učitavanje postavki
- dodavanje novih izbornika i novih radnji u izbornike
- povezivanja na signale drugih dodataka.
- Postavlja dodatke u stanje
Initialized. - Poziva funkcije extensionsInitialized() svih dodataka obrnutim redoslijedom u redu za učitavanje. Nakon funkcije
extensionsInitialized, dodatak bi trebao biti u potpunosti inicijaliziran, postavljen i pokrenut. Dodatak može pretpostaviti da su dodaci koji ovise o njemu u potpunosti postavljeni i može dovršiti inicijalizaciju dijelova koji se mogu proširiti drugim dodacima. Na primjer, dodatakCorepretpostavlja da su svi dodaci registrirali svoje akcije i dovršava inicijalizaciju upravitelja akcija. - Postavlja dodatke u stanje
Running.
Na kraju pokretanja, Core::ICore Core dodatka šalje dva signala. Prije nego što se prikaže Qt Creator sučelje, šalje se coreAboutToOpen(), a nakon toga coreOpened().
Nakon pokretanja, kada se izvršna petlja Qt Creator -a pokreće, upravitelj dodataka poziva funkcije delayedInitialize() svih dodataka obrnutim redoslijedom iz reda za učitavanje. Pozivi se izvršavaju na glavnoj niti, ali su razdvojeni zadržavanjem od nekoliko milisekundi kako bi se osigurala odzivnost Qt Creator-a. U funkciji delayedInitialize dodatak može izvršiti ne-kritičnu inicijalizaciju koja bi nepotrebno odgodila prikazivanje sučelja Qt Creator ako bi se izvršila tijekom pokretanja.
Nakon što su sve odgođene inicijalizacije dovršene, PluginManager šalje signal initializationDone().
Prije gašenja, Core::ICore dodatka Core šalje signal coreAboutToClose(). Nakon toga, upravitelj dodataka započinje svoju sekvencu gašenja:
- Poziva funkcije aboutToShutdown() svih dodataka po redučkom redu učitavanja. Dodaci bi ovdje trebali poduzeti mjere za ubrzanje stvarnog gašenja, poput isključivanja signala koji bi inače bili nepotrebno pozvani. Ako dodatak treba odgoditi stvarno zatvaranje na neko vrijeme, na primjer ako treba pričekati da se vanjski procesi završe radi čistog zatvaranja, dodatak može iz ove funkcije vratiti ExtensionSystem::IPlugin::AsynchronousShutdown. To će natjerati upravitelj dodataka da pričeka s idućim korakom i održati glavnu petlju događaja u pogonu, sve dok svi dodaci koji su zatražili AsynchronousShutdown ne pošalju signal asynchronousShutdownFinished().
- Uništava sve dodatke brisanjem njihovih instanci ExtensionSystem::IPlugin -a obrnutim redoslijedom iz reda za učitavanje. U tom se trenutku pozivaju destruktori dodataka. Dodaci bi se trebali pospremiti nakon sebe oslobađanjem memorije i drugih resursa.
Copyright © The Qt Company Ltd. and other contributors. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.