-1

Delphi-v5 と、スレッドで実行されるコンポーネント (TmFileScan -- Mats に感謝) を使用して、スレッドを正常に終了できるようにしたいと考えています。ここで多くの検索と読み取りを行った後、終了することができましたが、中止後に画面のクリーンアップを処理するイベントが必要です。

私が追加したスレッドで

while not(Terminated) do // Iterating about a zillion times :)
  ...

その後、アプリで...

Button1Click...
begin
  SearchThread.Terminate;
end;

そしてそれはうまく機能します。スレッドが正常に完了したときに発生する既存の OnReady イベントで画面をクリーンアップしました。ただし、スレッドが終了したかどうかは確認できないため、コンポーネントに OnAbort イベントを追加する必要があります。

誰かそのイベントのコード スニペットを教えてください。コンポーネントには Pause および Resume イベントがありますが、Abort はありません。

ありがとうございました。

4

1 に答える 1

3

TThreadクラスには利用OnTerminate可能なイベントがあります。これは、正常に終了するか、キャッチされていない例外を介して終了するかに関係なく、終了後に呼び出される仮想TThread.DoTerminate()メソッドによってトリガーされます。プロパティがTrueまたはプロパティがnilでない場合はオーバーライドしてイベントをトリガーし、それ以外の場合はイベントをトリガーすることをお勧めします。Execute()Execute()DoTerminate()OnAbortTerminatedFatalExceptionOnReady

更新:この TmFileScan コンポーネントOnReadyを使用していると仮定すると、イベントが常にトリガーされるように、次の変更を行うことをお勧めします。

TSearchThread = class(TThread)
private
  ...
protected
  ...
  procedure DoTerminate; override; // <-- add this
public
  destructor Destroy; override; // <-- add this
end;

constructor TSearchThread.Create(Owner: TmFileScan; SubDir, Started: Boolean;
  FilePaths, Filter: TStrings; fOnFileFound: TOnFileFoundEvent;
  fOnReady: TOnReadyEvent);
begin
  inherited Create(true);
  ...
  ffList := TStringList.Create; // <-- add this
  ...
  Resume;
end;

// add this
destructor TSearchThread.Destroy;
begin
  ffList.Free;
  inherited Destroy;
end;

procedure TSearchThread.Execute;
var
  ...
begin // function FindFile
  // remove this
  {
  ffList:= TStringList.Create;
  try
    while not Terminated do
    begin
  }
      for q:= 0 to ffPaths.Count - 1 do
      begin
        if Terminated then Break; // <-- add this
        for n:= 0 to ffFilters.Count - 1 do
        begin
          if Terminated then Break; // <-- add this
          Spec:= ffFilters[n];
          RFindFile(BackSlashFix(ffPaths[q]));
        end;
      end;
  // remove this
  {
      Synchronize(Ready); // <-- remove this
      Terminate;
    end;
  finally
    ffList.Free;
  end;
  }
end;

// add this
procedure TSearchThread.DoTerminate;
begin
  Synchronize(Ready);
  inherited;
end;
于 2013-05-31T21:39:55.920 に答える