C GTK3 - 在销毁主窗口之前如何等待/睡眠

时间:2018-03-10 18:21:56

标签: c gtk gtk3

我有一个涉及sshfs挂载的程序,当用户关闭主窗口时,我想首先卸载sshfs,然后对该sshfs挂载进行一些测试,告诉用户测试结果并最终关闭程序。

所以基本上,我只是想在测试之后,主窗口保持打开一段时间然后关闭。

我尝试将g_usleep(3000000);放在gtk_main_quit();之前,但它不起作用。

在GTK的踏板系统中挖掘了一下,然后我尝试了这个:

gboolean wait_func(gpointer data) {

    g_usleep(3000000);

    return FALSE;
}

void on_window_destroy(GtkWidget *object, app_widgets *app_wid)
{
    //close connection and verify state
    //....

    //updating label text
    gtk_label_set_text(GTK_LABEL(app_wid->lab_test),"connection closed. Exiting...");
    while(gtk_events_pending()) gtk_main_iteration();

    g_idle_add_full(G_PRIORITY_HIGH_IDLE,(GSourceFunc)wait_func,app_wid,(GDestroyNotify)gtk_main_quit);

}

但主窗口立即关闭,程序休眠3秒钟结束。我希望窗户能够保持开放状态。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

使用delete-event代替destroy。请注意,如果要继续触发FALSE

,事件处理程序必须返回destroy
#include <gtk/gtk.h>

static gboolean delete_event(GtkWidget *w, GdkEvent *e, gpointer d) {
  g_print("Doing stuff\n");
  g_usleep(3000000);
  g_print("Stuff done\n");

  return FALSE;
}

int main(int argc, char *argv[]) {
  GtkWidget *w;

  gtk_init(&argc, &argv);

  w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  g_signal_connect(w, "delete-event", G_CALLBACK (delete_event), NULL);
  g_signal_connect(w, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  gtk_widget_show(w);
  gtk_main();

  return 0;
}