高いCPU負荷を要する操作のグループを実行するGTKアプリケーションを拡張しています。GUIのボタンをクリックしてこの操作を停止する可能性を含めたいと思います。問題は、予想通り、操作が完了した直後にボタンからの信号が実際に発火することです。
今のところ、コードは次のようになっています。
[...]
// code snippet to show the dialog and to enable user interactions with the buttons on the lower side of the window
while(TRUE) {
gint run = gtk_dialog_run (window_main);
if (run == GTK_RESPONSE_APPLY) {
gboolean success = start_long_operation();
}
else if (run == GTK_RESPONSE_HELP) {
open_about();
}
else if (run == GTK_RESPONSE_CANCEL) {
stop_long_operation();
}
else {
gtk_widget_destroy (window_main);
return;
}
}
busy_state
long操作の関数によってチェックされるグローバル変数を宣言しました。それがTRUEの場合、単に内部ループが循環し続けます。それ以外の場合、ループは終了し、関数は結果を返します。
stop_long_operation()
このグローバル変数をFALSEに設定するだけです。
前に書いたように、ウィンドウ全体がブロックされるため、操作が終了するまで「停止」ボタンを押して「送信」することはできません。
gtkのドキュメントで説明されているようにwhile (g_main_context_iteration(NULL, FALSE))
、関数内でトリックを使用してみましたが、結果はありません。stop_long_operation()
本当にマルチスレッド機能を設定する必要がありますか?これを回避できますか?助けてくれてありがとう。