Životni ciklus dodatka

Da biste pisali dodatke za Qt Creator temeljene na C++-u, 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:

  1. Pretražuje svoje putanje za pretraživanje svih dinamičkih biblioteka 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.
  2. 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.
  3. Postavlja plugine u stanje Read.
  4. Provjerava da ovisnosti svakog dodatka postoje i da su kompatibilne. Za više informacija o ovisnostima dodataka pogledajte Meta-podatke dodatka.
  5. Postavlja dodatke u stanje Resolved.
  6. 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.
  7. Učitava biblioteke dodataka i stvara njihove instance IPlugin-a redoslijedom iz reda za učitavanje. U tom trenutku pozivaju se konstruktori dodataka. Dodaci na koje drugi dodaci ovise stvaraju se prvo.
  8. Postavlja dodatke u stanje spremni za učitavanje ( Loaded ).
  9. 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 ostalim dodacima. Plugin može pretpostaviti da su plugini na koje ovisi postavili svoje izvezene sučelja. Na primjer, plugin Core postavlja sučelja Core::ActionManager, Core::EditorManager i sva druga javno dostupna sučelja, tako da ih drugi plugini mogu zatražiti i koristiti.

    Funkcija initialize() plugina dobro je mjesto za

  10. Postavlja dodatke u stanje Initialized.
  11. Poziva funkcije extensionsInitialized() svih dodataka obrnutim redoslijedom u redu za učitavanje. Nakon funkcije extensionsInitialized, dodatak bi trebao biti u potpunosti inicijaliziran, postavljen i spreman za rad. Dodatak može pretpostaviti da su dodaci koji ovise o njemu u potpunosti postavljeni te može dovršiti inicijalizaciju dijelova koje mogu proširiti drugi dodaci. Na primjer, dodatak Core pretpostavlja da su svi dodaci registrirali svoje akcije i dovršava inicijalizaciju upravitelja akcija.
  12. Postavlja dodatke u stanje Running.

Na kraju pokretanja, Core::ICore Core dodatka šalje dva signala. Prije nego što se prikaže Qt Creator korisničko 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 pokreće svoj slijed gašenja:

  1. 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 dok svi dodaci koji su zatražili AsynchronousShutdown ne pošalju signal asynchronousShutdownFinished().
  2. 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 trebali pospremiti za sobom 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.