代码无法退出GTK应用程序 - 显然没有消息循环

pax*_*blo 7 c gtk

我试图弄清楚如何让GTK应用程序在一段时间后自动退出.

所以我有一个回调函数,意味着关闭应用程序:

static gboolean killOffApp (gpointer userData) {
    gtk_main_quit ();
    return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

然后,在activate信号处理程序中,我启动五秒计时器:

static void activate (GtkApplication* app, gpointer user_data) {
    GtkWidget *window = gtk_application_window_new (app);
    g_timeout_add_seconds (5, killOffApp, NULL);
    gtk_widget_show_all (window);
}
Run Code Online (Sandbox Code Playgroud)

并且,为了完整性,这里main附加信号处理程序并运行GTK应用程序:

int main (int argc, char **argv) {
    GtkApplication *app = gtk_application_new ("com.example", G_APPLICATION_FLAGS_NONE);
    g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    int status = g_application_run (G_APPLICATION (app), argc, argv);
    g_object_unref (app);
    return status;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当计时器触发时,调用gtk_main_quit似乎无效,我不知道为什么:

(MyProg:776): Gtk-CRITICAL **: gtk_main_quit: assertion 'main_loops != NULL' failed
Run Code Online (Sandbox Code Playgroud)

我在网上研究过这个问题,但只发现了以下两种情况:

  • 它是从内部循环运行的代码的一部分完成的(例如在对话框中)所以它关闭了那个而不是主循环(不是这里的情况,我相信); 要么
  • 没有循环运行,因为,例如,应用程序是一次性运行gtk_main_iteration_do(我不认为这是这里的情况).

我显然做错了什么,为什么我的应用程序似乎没有运行消息循环?

pax*_*blo 9

gtk_main_quit使用GtkApplication时,该功能似乎不合适.来自参与各种Gnome项目开发的人,其中一名Emmanuele Bassi (a)在其他地方发表评论(略带解释,尤其注意到第二段):

如果你正在调用g_application_run()那么你也不需要调用gtk_main():该run()方法将为你旋转主循环.

您也不会gtk_main_quit()用来停止应用程序的主循环:您应该使用它g_application_quit().


考虑到这一点,您需要将应用程序传递给回调,并使用它调用应用程序退出函数:

static void activate (GtkApplication* app, gpointer user_data) {
    GtkWidget *window = gtk_application_window_new (app);
    g_timeout_add_seconds (forceShutdown, killOffApp, app); // << here
    gtk_widget_show_all (window);
}

static gboolean killOffApp (gpointer userData) {
    g_application_quit (userData); // << and here
    return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

(a)在我看来,谁有一种过于自鸣得意的照片:-)