我试图弄清楚如何让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(我不认为这是这里的情况).我显然做错了什么,为什么我的应用程序似乎没有运行消息循环?
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)在我看来,谁有一种过于自鸣得意的照片:-)