0

ボタンをクリックした後に画像を追加してボタンに表示し、他の関数を呼び出して他のボタンに画像を表示する小さなボードゲームを書いていましたが、プログラムは思うように実行されませんでした。これらの機能がすべて完了するまで、ウィジェットは表示されませんでした。ここにデバッグがあります:

Breakpoint 1, GameControl::button_clicked (widget=0x80dad08, data=0x80563e0) at interface.cc:582
582 image = gtk_image_new_from_file ("arrow.bmp");
(gdb) step
583 gtk_container_add (GTK_CONTAINER (widget), image);
(gdb) step
584 gtk_widget_show (image);
(gdb) step
585 computer_move (widget, &control);
(gdb) step
GameControl::computer_move (widget=0x80dad08, data=0x80563e0) at interface.cc:520
520 computer_moving = true;
(gdb) break interface.cc:586
Breakpoint 2 at 0x804cdab: file interface.cc, line 586.
(gdb) continue
Continuing.
Breakpoint 2, GameControl::button_clicked (widget=0x80dad08, data=0x80563e0) at interface.cc:586
586 break;
(gdb) step
593 end_dialog ();
(gdb) next
595 }
(gdb) step
0xb7b1c243 in g_cclosure_marshal_VOID__VOIDv () from /usr/lib/i386-linux-gnu/libgobject-2.0.so.0
(gdb) step
Single stepping until exit from function g_cclosure_marshal_VOID__VOIDv,which has no line number information.
0xb7b33a29 in g_signal_emit_valist () from /usr/lib/i386-linux-gnu/libgobject-2.0.so.0
(gdb) next
Single stepping until exit from function g_signal_emit_valist,
which has no line number information.
0xb7b34453 in g_signal_emit () from /usr/lib/i386-linux-gnu/libgobject-2.0.so.0

(gdb) continue
Continuing.
[Thread 0xb6b86b40 (LWP 7820) exited]
[Thread 0xb61ffb40 (LWP 7821) exited]
[Inferior 1 (process 7817) exited normally]

最後の続行コマンドが実行されるまで、ウィジェットが表示されます。「gtk_widget_show ()」に移動したときに何らかの形でウィジェットが表示されなかった場合、何か提案はありますか?

4

1 に答える 1

2

GTK+ は、ほとんどの GUI ツールキットと同様に、イベント駆動型です。

メイン イベント ループ ( ) が次のイベントを処理できるように、コールバックから戻る必要がありますgtk_main()。そうしないと、プログラム全体がフリーズします。

コールバックの途中でいくつかのイベントを処理したい場合は、明示的に行います。ドキュメントから直接:

/* computation going on */

while (gtk_events_pending ())
    gtk_main_iteration ();

/* computation continued */
于 2013-08-03T06:31:45.707 に答える