Огромное спасибо, в целом все понятно, есть пара вопросов -
Код:
procedure TWorkerThread.Execute;
begin
....
Synchronize(CallMainForm);
end;
procedure TWorkerThread.CallMainForm;
begin
ThreadSync.Enter;
Try
If Assigned(FCallBack) Then FCallBack(Format('Thread #%d: %s',[FID,FMsg]));
Finally
ThreadSync.Leave;
End;
end;
почему FCallBack мы вызываем в критической секции если процедура CallMainForm и так вызывается методом Synchronize.
Во всех примерах, которые мне попадались, Synchronize и CriticalSection фигурируют как разные способы синхронизации.
Код:
procedure TUrlChek.Execute;
begin
....
cntlock.Enter;
trcount:= trcount-1;
cntlock.Leave;
Synchronize(AddGall);
end;
procedure TUrlChek.AddGall;
begin
....
второе: нужно что бы поток проверял наличие папки и при отсутствии создавал ее, не может ли здесь произойти конфликт?
И если можно еще два вопроса не совсем по теме:
1. правильно ли я понимаю - в цикле мы создаем потоки
Код:
Thrd := WorkerThread.Create(True,ThreadCallBack);
используя одну переменную только для того что бы передать новому потоку параметры
Код:
Thrd.FreeOnTerminate := True;
// и т.д.
а далее поток живет своей жизнью не как не связанный с переменной породившей его?
2. в потомке мы перегружаем конструктор
Код:
constructor Create(CreateSuspned : Boolean; CallBack : TCallMainFormEvent);
добавляя к нему аргумент (кстати, не должно ли там быть
override; как у
Execute), а можно ли убрать аргумент?
Код:
constructor TWorkerThread.Create(CallBack : TCallMainFormEvent);
begin
FCallBack := CallBack;
....
inherited Create(True);
end;