Показать сообщение отдельно
  #3  
Старый 14.12.2018, 09:49
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Огромное спасибо, в целом все понятно, есть пара вопросов -
Код:
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;
Ответить с цитированием