Я хотел бы подкласс TThread
, чтобы иметь класс потоков, который, когда FreeOnTerminate = True
, устанавливает в nil
его ссылочную переменную. Другими словами, я хочу сделать что-то вроде этого:Как установить внешнюю переменную в ноль внутри метода?
TFreeAndNilThread = class(TThread)
private
FReferenceObj: TFreeAndNilThread; //?? // <-- here I'm holding the reference to myself
protected
procedure Execute;
procedure DoTerminate; override; // <-- here I'll set FReferenceObj to nil after inherited (only if FreeAndNil = True)
public
constructor Create(CreateSuspended: Boolean; var ReferenceObj); reintroduce; <-- untyped param like FreeAndNil and TApplication.CreateForm ??
end;
Потребитель код должен быть таким:
var
MyThread: TFreeAndNilThread;
begin
MyThread := TFreeAndNilThread.Create(True, MyThread);
MyThread.FreeOnTerminate := True;
MyThread.Resume;
end;
... и тогда я мог бы безопасно проверить Assigned(MyThread)
.
Я вижу, как FreeAndNil
удается установить ссылочный объект, пройденный нетипизированным параметром, до nil
, но он делает это локально. В моем случае я должен «сохранить» его в поле класса (FReferenceObj
) и сделать его ноль в другом месте (DoTerminate
).
Как я могу правильно передать, сохранить и получить его? Я могу думать о передаче и хранении адреса MyThread вместо MyThread, но я надеюсь, что есть более элегантный способ.
Спасибо!
Должно быть, что-то не хватает. Что не так с подключением 'OnTerminate' и установкой' MyThread: = nil'? (или удаление записи из списка потоков, если на то пошло) –
OnTerminate выполняется в основном потоке, потому что называется синхронным (см. стандартную реализацию 'DoTerminate'. – yankee
@ yankee. Но вам нужно убедиться, что код, который устанавливает ссылку на 'nil', выполняется в том же потоке, который обращается к этой ссылке. –