1

2 つのボタン ( AB ) と描画領域 ( C )を備えた小さな GTK アプリケーションがあります。Aをクリックすると、Cのサイズが再計算され、gtk_widget_set_size_request() で設定されます。これにより、エクスポーズ イベントが発生し、そのハンドラーがデータを計算します。さらに、Aをクリックすると、 Bでクリックされたシグナルが発せられ、そのハンドラーはCエクスポーズイベントによって計算されたデータを必要とします。

実際にはすべて正常に動作しますが、expose-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 ツールキット) は、描画とイベント処理をすべて 1 つのスレッドで行います。したがって、公開イベントが発行されると、キューに入れられ、a_handler返された後にのみ処理されます。

私の意見では、計算を GUI 描画に結び付ける正当な理由がない場合は、計算を別の場所に移動するのが最善の方法です。たとえば、と のcalculate_data両方から呼び出される別のメソッドが存在する可能性がb_handlerありc_handlerます。

次の最良の方法はgdk_window_process_updates、公開イベントを強制的にすぐに処理するように呼び出すことです: 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 に答える