2017-07-04 3 views
3

Meine gtk3-Anwendung kann entweder innerhalb einer GUI oder im Daemon-Modus laufen. Um den Daemon-Modus zu realisieren, verwende ich g_application_hold().gtk3 - Abmeldung während g_application_hold()

Bis jetzt funktioniert das großartig, aber sobald ich mich von meiner Sitzung abmelde, während ich die Anwendung im Daemon-Modus starte, friert mein System für 8 Sekunden ein, bis OS es tötet. So wird meine Clean-Shutdown-Prozedur nicht ausgeführt. Das passiert nur für den Daemon, nicht im GUI-Modus.

Derzeit löste ich das Problem, indem das Signal SIGHUP Einhaken, die eine Sitzung logout zu realisieren verwendet werden können:

static void 
handle_hangup_signal (int signal) 
{ 
    MyApplication  *application = my_application_get(); 
    g_application_release (G_APPLICATION (application)); 
} 
... 
signal(SIGHUP, handle_hangup_signal); 

Das ist mein Fehler behebt. Keine 8 Sekunden Verzögerung, mein Clean-Shutdown wird ausgeführt.

Allerdings frage ich mich, ob es eine sauberere gtk3-Lösung gibt? Ist es in Ordnung, g_application_hold() zu verwenden, oder gibt es eine bessere gtk3-Möglichkeit, etwas im Daemon-Modus zu starten?

+1

Gtk macht Sinn wenn es UI gibt, wenn nicht, dann prüfe GLIB Funktionen. Versuchen Sie, die Logik zu trennen, um die Benutzeroberfläche zu trennen. –

+1

@ JoséFonte In diesem Fall startet die Anwendung (Xfce's Thunar) als Daemon, um weitere Initialisierungen zu beschleunigen und Dateiübertragungen auch dann zu übernehmen, wenn das letzte Fenster geschlossen wird. Es funktioniert gut in seiner gtk2-Version, aber nach der Migration zu gtk3/GApplication/gdbus begann dieser Nebeneffekt. – AndreLDM

+1

Nun, g_application_hold/release verhält sich ein wenig wie g_object_ref/unref. Wenn Sie Signale (os) verwenden, dann muss die Anwendung * nur unix sein, verwenden Sie die Unix-Funktionen von glib: [g_unix_signal_add/add_full] (https://developer.gnome.org/glib/stable/glib-UNIX-specific-utilities-and- integration.html). Nicht sicher, warum UI Freezes obwohl. –

Antwort

0

Endlich kenne ich den Grund für dieses seltsame Verhalten. Es wurde durch eine direkte gtk_main_quit() ausgelöst, ausgelöst durch den Session-Manager.

Wenn eine g_application_release(..). Zeile vor ausgeführt wird, gibt es keine Abmeldung mehr.

Eigentlich sogar ein Gtk-KRITISCH wurde diese gtk_main_quit() ausgelöst:

Gtk-CRITICAL **: gtk_main_quit: assertion 'main_loops != NULL' failed 

Bis jetzt habe ich die Nachricht einfach nicht sehen, weil die Session-Manager bereits besitzt Konsole geschlossen.