我的gtk3應用程序可以在GUI或守護進程模式下運行。爲了實現守護進程模式,我使用了g_application_hold()。gtk3 - g_application_hold()期間註銷
到目前爲止,這個工作很好,但是一旦我以會話模式運行應用程序時從會話中註銷,我的系統就會凍結8秒,直到操作系統終止它爲止。就像我乾淨的關機程序沒有執行。 這隻發生在守護進程中,而不是在GUI模式下發生。
目前我通過掛鉤SIGHUP信號,可用於實現會話註銷解決了這個問題:
static void
handle_hangup_signal (int signal)
{
MyApplication *application = my_application_get();
g_application_release (G_APPLICATION (application));
}
...
signal(SIGHUP, handle_hangup_signal);
這修復我的錯誤。沒有8秒的延遲,我的乾淨關閉被執行。
但是我想知道是否有更乾淨的gtk3解決方案?使用g_application_hold()是好的,還是有一些更好的gtk3方式在守護進程模式下啓動某些東西?
當有UI時,Gtk就有意義,如果沒有,那麼檢查GLib函數。嘗試分離邏輯以使UI分離。 –
@JoséFonte在這種情況下,應用程序(Xfce的Thunar)作爲守護進程啓動,以加速進一步的初始化並處理文件傳輸,即使最後一個窗口關閉。它在gtk2版本中工作正常,但在遷移到gtk3/GApplication/gdbus後,這種副作用開始了。 – AndreLDM
好吧,g_application_hold/release的行爲有點像g_object_ref/unref。如果使用信號(os),那麼應用程序必須只有* unix,使用glib的unix函數:[g_unix_signal_add/add_full](https://developer.gnome.org/glib/stable/glib-UNIX-specific-utilities-and- integration.html)。不知道爲什麼UI凍結。 –