Library/Application: switch the GUI-Thread

...likewise using an detached »autonomous« Thread.
In this case however it is simpler to embed the complete use
of GtkLumiera into a lambda function, which ends with invoking
the terminationSignal functor. This way, the order of creation,
running the GTK-Loop and destroying the GUI is hard coded.
This commit is contained in:
Fischlurch 2023-10-12 02:48:07 +02:00
parent 5db49afafd
commit 184c93750a
2 changed files with 78 additions and 27 deletions

View file

@ -49,10 +49,10 @@
#include "stage/gtk-base.hpp"
#include "lib/error.hpp"
#include "lib/thread.hpp"
#include "stage/ui-bus.hpp"
#include "stage/guifacade.hpp"
#include "stage/ctrl/ui-manager.hpp"
#include "vault/thread-wrapper.hpp"
#include "common/subsys.hpp"
#include "lib/nocopy.hpp"
@ -65,8 +65,8 @@ extern "C" {
using vault::Thread;
using lumiera::Subsys;
using lib::launchDetached;
using lumiera::error::LUMIERA_ERROR_STATE;
using stage::LUMIERA_INTERFACE_INAME(lumieraorg_Gui, 1);
@ -128,28 +128,24 @@ namespace stage {
return errorMsgBuff;
}
};
void
runGUI (Subsys::SigTerm reportOnTermination) ///< this is the UI-Thread
{
string shutdownLog = GtkLumiera{}.run();
// inform main thread that the GUI has been shut down...
reportOnTermination (&shutdownLog);
}//(End) GUI-Thread.
//(End) GUI-Thread.
}//(End) impl details
bool
launchUI (Subsys::SigTerm& terminationHandle)
launchUI (Subsys::SigTerm& reportOnTermination)
{
try
{
Thread {"GUI-Main", bind (&runGUI, terminationHandle)}; ///////////////////////////////////////////OOO this shows we need a self-contained and detached thread!
launchDetached ("GUI-Main"
, [reportOnTermination]
{
string shutdownLog = GtkLumiera{}.run();
// inform main thread that the GUI has been shut down...
reportOnTermination (&shutdownLog);
});
return true; // if we reach this line...
}
catch(...)

View file

@ -65010,7 +65010,7 @@
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1696468379848" ID="ID_1146069423" MODIFIED="1697054187170" TEXT="Erg&#xe4;nzung: autonomous Thread">
<linktarget COLOR="#bc3562" DESTINATION="ID_1146069423" ENDARROW="Default" ENDINCLINATION="444;909;" ID="Arrow_ID_516910789" SOURCE="ID_137837629" STARTARROW="None" STARTINCLINATION="-1280;-32;"/>
<linktarget COLOR="#5a83aa" DESTINATION="ID_1146069423" ENDARROW="Default" ENDINCLINATION="444;909;" ID="Arrow_ID_516910789" SOURCE="ID_137837629" STARTARROW="None" STARTINCLINATION="-1280;-32;"/>
<icon BUILTIN="pencil"/>
<node COLOR="#435e98" CREATED="1696468398477" ID="ID_1775921981" MODIFIED="1696966299356" TEXT="neue Anforderung: komplett abgekoppelt">
<icon BUILTIN="yes"/>
@ -66293,7 +66293,8 @@
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1696893013891" ID="ID_1856740667" MODIFIED="1697068782982" TEXT="damit bestehende Probleme im Applikations-Code l&#xf6;sen">
<icon BUILTIN="pencil"/>
<node CREATED="1696893026770" ID="ID_253995958" MODIFIED="1696893031336" TEXT="GtkLumiera">
<node COLOR="#338800" CREATED="1696893026770" ID="ID_253995958" MODIFIED="1697079847058" TEXT="GtkLumiera">
<icon BUILTIN="button_ok"/>
<node CREATED="1696893056374" MODIFIED="1696893056374" TEXT="Variante-1"/>
</node>
<node COLOR="#338800" CREATED="1696893037535" ID="ID_1340852722" MODIFIED="1697068777127" TEXT="OutputDirector">
@ -81506,11 +81507,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1696538756712" ID="ID_1037865278" LINK="#ID_1688404846" MODIFIED="1696541639911" TEXT="ThreadWrapperAutonomous_test">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1696538756712" ID="ID_1037865278" LINK="#ID_1688404846" MODIFIED="1697079830508" TEXT="ThreadWrapperAutonomous_test">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1696538825003" ID="ID_1146104670" LINK="#ID_1787030725" MODIFIED="1696538953992" TEXT="ThreadWrapperLifecycle_test">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1696538825003" ID="ID_1146104670" LINK="#ID_1787030725" MODIFIED="1697079831677" TEXT="ThreadWrapperLifecycle_test">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1695394753483" FOLDED="true" ID="ID_1338410455" MODIFIED="1696030309964" TEXT="SyncBarrier_test">
<icon BUILTIN="button_ok"/>
@ -82464,13 +82465,67 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1696029465121" ID="ID_786350998" MODIFIED="1696541244997" TEXT="gtk-lumiera.cpp">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1696468041645" ID="ID_137837629" MODIFIED="1696541241831" TEXT="brauche einen Thread, den man in den Hintergrund schieben kann">
<arrowlink COLOR="#bc3562" DESTINATION="ID_1146069423" ENDARROW="Default" ENDINCLINATION="444;909;" ID="Arrow_ID_516910789" STARTARROW="None" STARTINCLINATION="-1280;-32;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1696029465121" ID="ID_786350998" MODIFIED="1697079789466" TEXT="gtk-lumiera.cpp">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1696468041645" ID="ID_137837629" MODIFIED="1697079810297" TEXT="brauche einen Thread, den man in den Hintergrund schieben kann">
<arrowlink COLOR="#5a83aa" DESTINATION="ID_1146069423" ENDARROW="Default" ENDINCLINATION="444;909;" ID="Arrow_ID_516910789" STARTARROW="None" STARTINCLINATION="-1280;-32;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1697074837137" ID="ID_1676366081" MODIFIED="1697079198786" TEXT="umstellen auf ein self-managed Thread-Objekt">
<icon BUILTIN="button_cancel"/>
<node CREATED="1697074871061" ID="ID_1947484765" MODIFIED="1697074877752" TEXT="die stateische Methode runGUI f&#xe4;llt weg"/>
<node CREATED="1697074879331" ID="ID_1600154985" MODIFIED="1697074890470" TEXT="daf&#xfc;r erbt GtkLumiera nun von ThreadHookable"/>
<node CREATED="1697074891490" ID="ID_1903908027" MODIFIED="1697074909875" TEXT="mu&#xdf; unbedingt eine Sync-Barrier einziehen">
<node CREATED="1697074911127" ID="ID_359674865" MODIFIED="1697074931129" TEXT="sonst sind die GUI-Komponenten nicht rechtzeitig fertig"/>
<node CREATED="1697074933422" ID="ID_1367938500" MODIFIED="1697074943014" TEXT="vor allem werden hier noch dynamische Libs geladen">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1696468692302" ID="ID_1299573982" MODIFIED="1697068881651" TEXT="SteamDispatcher und OutputDirector brauchen das ebenso">
<node COLOR="#5b280f" CREATED="1697074948090" ID="ID_1670658341" MODIFIED="1697074961262" TEXT="SyncBarrier als Parameter &#xfc;bergeben">
<icon BUILTIN="button_cancel"/>
</node>
<node CREATED="1697074962089" ID="ID_1822899395" MODIFIED="1697074967947" TEXT="stattdessen als globale Variable"/>
</node>
<node BACKGROUND_COLOR="#d1bba1" COLOR="#990000" CREATED="1697074973343" ID="ID_1959135730" MODIFIED="1697079190318" TEXT="Probleme beim Shutdown">
<icon BUILTIN="broken-line"/>
<node CREATED="1697074982953" ID="ID_442353467" MODIFIED="1697075045858" TEXT="anscheinend werden Teile des GUI erst nach dem Ende von Lumiera-Main abgebaut">
<icon BUILTIN="info"/>
</node>
<node CREATED="1697079081169" ID="ID_265281556" MODIFIED="1697079119273" TEXT="das hei&#xdf;t: sigTerm wurde zu fr&#xfc;h aufgerufen &#x27f9; Kontrakt gebrochen"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697079120028" ID="ID_1679819691" MODIFIED="1697079140133">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
das ist jetzt alles <b>keine Verbesserung</b>
</p>
</body>
</html></richcontent>
<icon BUILTIN="stop-sign"/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1697079202857" ID="ID_1873620369" MODIFIED="1697079742143" TEXT="die alte L&#xf6;sung war gar nicht so schlecht">
<icon BUILTIN="idea"/>
<node CREATED="1697079212001" ID="ID_358578864" MODIFIED="1697079225323">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
sie sieht blo&#223; &#187;umst&#228;ndlich&#171; aus
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1697079226102" ID="ID_1747368145" MODIFIED="1697079235936" TEXT="der Vorteil: die Reihenfolge ist explizit festgelegt"/>
<node CREATED="1697079242804" ID="ID_440022982" MODIFIED="1697079265220" TEXT="der Thread umschlie&#xdf;t die gesamte GUI-Funktionalit&#xe4;t"/>
</node>
<node COLOR="#338800" CREATED="1697079753844" ID="ID_1211321573" MODIFIED="1697079778251" TEXT="Umstellung: runGUI &#x27f6; in &#x3bb; packen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1697079779058" ID="ID_370018589" MODIFIED="1697079784793" TEXT="tut">
<icon BUILTIN="ksmiletris"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1696468692302" ID="ID_1299573982" MODIFIED="1697079748206" TEXT="SteamDispatcher und OutputDirector brauchen das ebenso">
<arrowlink COLOR="#1f9fe7" DESTINATION="ID_871343805" ENDARROW="Default" ENDINCLINATION="173;10;" ID="Arrow_ID_1685700346" STARTARROW="None" STARTINCLINATION="-8;8;"/>
</node>
</node>