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