Я использую глобальный KillThreadList: TList.
Я отслеживаю это в своей теме как:
while (Not Terminated) do
begin
inc(Inker);
if (WaitForSingleObject(FTick, finterval) = WAIT_TIMEOUT) then
Begin
if Inker >= 10 then
Begin
ProcessTables;
Inker := 0;
sleep(1000);
End;
if KillThreadList.Contains(ThreadID) = True then Terminate;
End;
end;
Я также проверяю KillThreadList в своих процессах, чтобы позволить мне отказаться от них до завершения, где это безопасно.
Я передаю событие OnTerminate главному потоку и удаляю там ThreadID из KillList. Я широко использую эту модель, и она меня еще не подвела.
procedure TfrmProcessQualcommLocations.OnTerminateThread;
var
ThreadID : Cardinal;
i : integer;
aStatusBar :TStatFrame;
begin
ThreadID := (Sender as Tthread).ThreadID;
for i := 0 to StatusBarList.Count -1 do
Begin
if StatusBarList.Items[i].ThreadID = ThreadID then
Begin
aStatusBar := StatusBarList.Items[i];
KillThreadList.Extract(ThreadID);
StatusBarList.Extract(aStatusBar);
aStatusBar.Free;
break;
End;
End;
self.Refresh;
end;
В приведенном выше случае я также удаляю некоторые графические элементы.
Надеюсь, это поможет.
SpringerRider