2016-04-28 109 views
6

我試圖弄清楚如何讓GTK應用程序在一定時間後自動退出 。代碼不能從GTK應用程序退出 - 顯然沒有消息循環

所以我這是爲了關閉應用程序的回調函數:

static gboolean killOffApp (gpointer userData) { 
    gtk_main_quit(); 
    return FALSE; 
} 

然後,在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); 
} 

而且,爲了完整起見,下面是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; 
} 

我的問題是,定時器觸發時,調用gtk_main_quit似乎是無效的,我不知道爲什麼:

(MyProg:776): Gtk-CRITICAL **: gtk_main_quit: assertion 'main_loops != NULL' failed 

我已經研究了網絡上的問題,但只找到的東西在那裏或者:

  • 它是從哪裏有運行(如在對話框)的內部循環的代碼的一部分,這樣做它會關閉一個,而不是主迴路(不是這裏的情況,我相信) ;或
  • 沒有循環運行,因爲,例如,應用程序運行的是一次性的gtk_main_iteration_do(我認爲這裏也不是這種情況)。

我明顯在做東西錯了,爲什麼我的應用程序似乎沒有消息循環運行?

回答

5

當使用GtkApplication時,gtk_main_quit函數似乎不適合。從別人誰曾參與不同的GNOME項目的開發,一個Emmanuele Bassi(一)評論elsewhere(略轉述並特別注意到第二段):

如果你調用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; 
} 

(一)誰,在我看來,有的方式太自在的照片:-)

+0

什麼h如果你調用['g_application_quit()'](https://developer.gnome.org/gio/unstable/GApplication。html#g-application-quit)而不是'gtk_main_quit()'在你原來的代碼中? – andlabs

+0

@andlabs,一旦我將應用程序傳遞給回調函數,也可以工作。將更新答案。 – paxdiablo

+0

那應該可以更清楚地記錄下來;你可以在官方的GNOME bugzilla上提出一個問題,建議文檔說如果你使用GtkApplication不要調用'gtk_main_quit()'... – andlabs