Я хочу создать и запустить поток, все с одной командной строкой TClientCopyThread.Create(...)
. Для этого я должен создать поток с Suspended = False
, чтобы он мог работать немедленно. Я знаю, что когда я пишу constructor
нового объекта, в первую очередь я должен вызвать inherited Create
, чтобы экземпляр объекта был создан, а затем уже выполнять свои инициализации. Но здесь, если я вызову inherited
, поток запустится без инициализированных параметров. Пытаюсь вызвать inherited
последним и вроде работает (никаких нарушений прав доступа не получаю), но точно не знаю, совпадение это или нет.
TClientCopyThread = class(TThread)
private
OwnGUID: String;
SrcPath, DestPath: String;
Files: TFileNames;
RemoveIt: Boolean;
protected
procedure Execute; override;
public
constructor Create(const GUID, ASrcPath, ADestPath: String;
const FileNames: TFileNames; RemoveSrc: Boolean);
end;
constructor TClientCopyThread.Create(const GUID, ASrcPath, ADestPath: String;
const FileNames: TFileNames; RemoveSrc: Boolean);
var I: Integer;
begin
SrcPath:= Copy(ASrcPath, 1, Length(ASrcPath));
DestPath:= Copy(ADestPath, 1, Length(ADestPath));
SetLength(Files, Length(FileNames));
for I:= 0 to High(Files) do
Files[I]:= Copy(FileNames[I], 1, Length(FileNames[I]));
RemoveIt:= RemoveSrc;
FreeOnTerminate:= True;
inherited Create;
end;
Start
нить из конструктора. / Хорошо, так что память для моего нового объекта уже выделена, когда я вхожу в конструктор? - person Marus Nebunu   schedule 19.09.2020TThread
уже делает точно это, когдаCreateSuspended=False
- person Remy Lebeau   schedule 19.09.2020TThread.Start()
вызывает исключениеEThread
, если объектTThread
был создан с помощьюCreateSuspended=False
, или если поток уже завершил выполнение, или еслиStart()
уже был вызван, или если указательTThread
был получен при вызовеTThread.CurrentThread
в потоке, отличном отTThread
. Таким образом, должно быть совершенно безопасно вызыватьStart()
внутри производного конструктора при использованииinherited Create(True)
. Если это не работает, то это ошибка, которую необходимо исправить. - person Remy Lebeau   schedule 19.09.2020