Используйте WaitForMultipleObjects()
с массивом из двух событий вместо WaitForSingleObject()
. Добавьте событие ручного сброса в класс потока и сообщите об этом после того, как вы установили Terminated
в True
. Проверьте возвращаемое значение, о каком из двух событий было сообщено, и действуйте соответственно.
Edit:
Небольшой минимальный код Delphi 2009 для демонстрации идеи. Вы должны добавить SyncObjs
в список используемых единиц и добавить
fTerminateEvent: TEvent;
в раздел private
вашего класса потока.
constructor TTestThread.Create;
begin
inherited Create(TRUE);
fTerminateEvent := TEvent.Create(nil, True, False, '');
// ...
Resume;
end;
destructor TTestThread.Destroy;
begin
fTerminateEvent.SetEvent;
Terminate; // not necessary if you don't check Terminated in your code
WaitFor;
fTerminateEvent.Free;
inherited;
end;
procedure TTestThread.Execute;
var
Handles: array[0..1] of THandle;
begin
Handles[0] := ...; // your event handle goes here
Handles[1] := fTerminateEvent.Handle;
while not Terminated do begin
if WaitForMultipleObjects(2, @Handles[0], False, INFINITE) <> WAIT_OBJECT_0 then
break;
// ...
end;
end;
Вам нужно только добавить к нему код в вашем вопросе. Простая попытка освободить экземпляр потока сделает все необходимое, чтобы разблокировать поток (при необходимости).