3

簡単にするために、私のDelphi XEアプリケーションには、いくつかの条件に基づいてファイルを生成するオブジェクトが含まれています。1つのオブジェクトはテキストファイルを生成でき、他のオブジェクト(前者から継承)はXMLまたはHTMLファイルを生成できます。 。それらはすべて共通の祖先を持っていますが、スレッド上で実行されません!

現在、ユーザーがキャンセルボタンを押すたびに、生成プロセス全体をキャンセルする方法を追加しようとしています。問題は、これが機能するための準備が整っていないことです。最も基本的なアクションはif user_canceled then halt_process、生成プロセス全体を通してあちこちにたくさん追加することですが、これは最適なソリューションではないと思います。

私の質問は、これを行うためのよりスマートな方法があるかどうかを知ることですか?または、将来、より多くの生成コード(したがってキャンセルテスト)を追加する必要があるときに、この追加をより適切に統合できるように、コードのリファクタリングに関する推奨事項はありますか?

4

2 に答える 2

2

プロセスをキャンセルしてプログラムを有効な状態のままにする方法がないため、プロセスをキャンセルする必要がある場合は、手動チェックを追加する必要があります。コンパイラ/プログラムは、どの操作がアトミックで、どの操作がアプリケーションロジックにないかを認識していません。

例えば

OpenFile(...);  //<- if program halts anywhere before CloseFile you have the file locked
...
CloseFile;

最適なソリューションは、既存の設計に大きく依存します。キューに入れられたアクションの単純なケースでは、A -> B -> C -> Dそれをスレッドにラップしてif Terminated then Exit;アクション間に追加すると機能します(もちろん、一時オブジェクトがある場合は適切に解放します)。

于 2012-06-26T12:44:06.227 に答える
0

キャンセルを実装する良い方法は、EAbortを使用することだと思います。ファイルを開いて閉じて最後に試してみる限り、EAbortを上げると(ボタンのクリックなど)、アクションの長いリストから非常にうまく抜け出すことができます。動作しないはずですが、動作します。

于 2012-06-28T12:42:25.873 に答える