gtk3 - 在 g_application_hold() 期间注销
gtk3 - logout during g_application_hold()
我的 gtk3 应用程序可以 运行 在 GUI 中或在守护程序模式下。为了实现daemon-mode,我使用g_application_hold().
到目前为止效果很好,但是当我在 运行 以守护进程模式运行应用程序时从我的会话注销,我的系统会冻结 8 秒,直到 OS 终止它。就像我的干净关机程序没有被执行。
这只发生在守护进程中,而不是在 GUI 模式下。
目前我通过hook SIGHUP信号解决了这个问题,可以用来实现session logout:
static void
handle_hangup_signal (int signal)
{
MyApplication *application = my_application_get ();
g_application_release (G_APPLICATION (application));
}
...
signal(SIGHUP, handle_hangup_signal);
这修复了我的错误。没有8秒延迟,我的clean-shutdown被执行了。
但是我想知道是否有更干净的gtk3 解决方案?使用 g_application_hold() 是否合适,或者是否有更好的 gtk3 方式在守护进程模式下启动某些东西?
我终于知道了这种奇怪行为的原因。它是由会话管理器触发的直接 gtk_main_quit()
引起的。
如果 g_application_release(..).
在前一行执行,则不再有注销延迟。
实际上连 Gtk-CRITICAL 都被触发了 gtk_main_quit()
:
Gtk-CRITICAL **: gtk_main_quit: assertion 'main_loops != NULL' failed
直到现在我还没有看到消息,因为会话管理器已经关闭了拥有的控制台。
我的 gtk3 应用程序可以 运行 在 GUI 中或在守护程序模式下。为了实现daemon-mode,我使用g_application_hold().
到目前为止效果很好,但是当我在 运行 以守护进程模式运行应用程序时从我的会话注销,我的系统会冻结 8 秒,直到 OS 终止它。就像我的干净关机程序没有被执行。 这只发生在守护进程中,而不是在 GUI 模式下。
目前我通过hook SIGHUP信号解决了这个问题,可以用来实现session logout:
static void
handle_hangup_signal (int signal)
{
MyApplication *application = my_application_get ();
g_application_release (G_APPLICATION (application));
}
...
signal(SIGHUP, handle_hangup_signal);
这修复了我的错误。没有8秒延迟,我的clean-shutdown被执行了。
但是我想知道是否有更干净的gtk3 解决方案?使用 g_application_hold() 是否合适,或者是否有更好的 gtk3 方式在守护进程模式下启动某些东西?
我终于知道了这种奇怪行为的原因。它是由会话管理器触发的直接 gtk_main_quit()
引起的。
如果 g_application_release(..).
在前一行执行,则不再有注销延迟。
实际上连 Gtk-CRITICAL 都被触发了 gtk_main_quit()
:
Gtk-CRITICAL **: gtk_main_quit: assertion 'main_loops != NULL' failed
直到现在我还没有看到消息,因为会话管理器已经关闭了拥有的控制台。