我不知道哈斯克爾綁定,但在任何普通C通過利用超時GSource很容易實現。
#include <gtk/gtk.h>
static guint source_id = 0;
static gboolean do_stuff(gpointer user_data)
{
g_print("doing stuff...\n");
return FALSE;
}
static void postpone(void)
{
if (source_id > 0)
g_source_remove(source_id);
source_id = g_timeout_add(1000, do_stuff, NULL);
}
int main(int argc, char **argv)
{
GtkWidget *window, *text_view;
GtkTextBuffer *text_buffer;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL);
text_view = gtk_text_view_new();
gtk_container_add(GTK_CONTAINER(window), text_view);
text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
g_signal_connect(text_buffer, "changed", G_CALLBACK(postpone), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
雖然超時之前退出TextView的問題仍然處於打開狀態。
來源
2013-01-13 11:49:37
ntd
我在wxHaskell中做了一個類似的事情的一個方法是使用設置爲(可配置)1秒延遲的Timer對象,並且每次用戶鍵入時啓用它,這會在鍵入完成後延遲一秒鐘。我放棄了gtk,所以我不熟悉它,但也許你可以使用[Graphics.UI.Gtk.General.General]中的'timeoutAdd'或'timeoutAddFull'和'timeoutRemove'來做類似的事情(http:// hackage.haskell.org/packages/archive/gtk/0.12.3/doc/html/Graphics-UI-Gtk-General-General.html)。 – AndrewC
不知道在Haskell端口中調用了什麼,但這是'g_idle_add()'的用途。 – ptomato
或者(對@ AndrewC的建議),記錄最後一次用戶輸入的時間,並在週期性超時時間內檢查以確定何時運行繁重的代碼。 – ergosys