2017-07-04 28 views
3

我的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方式在守護進程模式下啓動某些東西?

+1

當有UI時,Gtk就有意義,如果沒有,那麼檢查GLib函數。嘗試分離邏輯以使UI分離。 –

+1

@JoséFonte在這種情況下,應用程序(Xfce的Thunar)作爲守護進程啓動,以加速進一步的初始化並處理文件傳輸,即使最後一個窗口關閉。它在gtk2版本中工作正常,但在遷移到gtk3/GApplication/gdbus後,這種副作用開始了。 – AndreLDM

+1

好吧,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凍結。 –

回答

0

最後我知道這種奇怪行爲的原因。這是由會話管理器觸發的直接gtk_main_quit()造成的。

如果g_application_release(..).在一行之前執行,則不再有註銷延遲。

居然連一個GTK-CRITICAL得到了由該gtk_main_quit()觸發:

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

直到現在我只是沒有看到消息,因爲會話管理器已關閉了擁有控制檯。