1

我有一个带有两个按钮(AB)和一个绘图区域(C)的小 GTK-Application 。当我单击A时,应重新计算C的大小并使用 gtk_widget_set_size_request() 进行设置。这将导致一个暴露事件,其处理程序将计算一些数据。此外,单击A将在B处发出clicked信号,其处理程序需要由Cexpose-event计算的数据。

事实上,一切正常,但暴露事件以某种方式延迟,并且单击的处理程序在之前被调用并且数据(您可能猜到了)丢失了。

a_handler() {
   new_size = calculate_size();
   gtk_widget_set_size_request(C, new_size); //Will cause expose-event
   g_signal_emit_by_name(B, "clicked");
}

b_handler() {
   calculate_something(data); //Error
}

c_handler() {
   draw_something();
   data = calcluate_data();
}

我能做些什么?

4

2 回答 2

1

Gtk(和大多数其他 GUI 工具包)在一个线程中完成所有绘制和事件处理。因此,当暴露事件被发出时,它会进入一个队列,只有在a_handler返回后才会被处理。

我认为最好的方法是将计算移到其他地方,如果没有充分的理由将其绑定到 GUI 绘图中。例如,可能有一个从和calculate_data调用的单独方法。b_handlerc_handler

The next best way is to call gdk_window_process_updates to force the expose event to be handled immediately: http://developer.gnome.org/gdk/stable/gdk-Windows.html#gdk-window-process-updates

于 2012-08-28T13:04:16.207 回答
0

丑陋的解决方法通常是添加对 的调用gtk_main_iteration(),例如在调用gtk_widget_set_size_request()和信号发射之间。

于 2012-08-28T12:14:15.063 回答