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

Цитата:
В твоем варианте реализации тред просто выполняет задание и завершается (в смысле, когда больше заданий нет), а не ждет когда они появятся.
Собственно так и было задумано. Было два варианта: или оставлять потоки крутить цикл while not Terminated, в ожидании новых заданий, либо дать им самовыпилиться, а при необходимости создать их снова.

А с ошибкой вопрос решился, хотя до конца я не понимаю как.
Код:
.........
while FTaskExist do       //Обработка заданий из очереди
 begin
  CS.Enter;
  try
   if FQueue.Count > 0 then
   FData:= FQueue.Extract(FQueue.First)
   else FTaskExist:= False; // Вместо FTaskExist:= FData <> nil
  finally
   CS.Leave;
  end;
 // FTaskExist:= FData <> nil; строку убрал
  if FTaskExist then
  begin
   case FMode of
    dmCheck: CheckUrlProc(TCheckerData(FData));
    //другие варианты обработки
   end;
   Synchronize(CallMainForm); //Дебаггер ругается
  end;
 end;
.............
В таком варианте проблема пропала....
Пока писал вроде бы нашел причину.
Второй вариант исправления ошибки и как мне кажется теперь уже правильный. Поверку наличия очередного задания оставляю в старом варианте
Код:
FTaskExist:= FData <> nil;
а вот убивал FData я не правильно
Код:
procedure TDLThrd.CheckUrlProc(AData: TCheckerData);
begin
.........................
 // FreeAndNil(AData);
FreeAndNil(FData);
end;
т.е. FreeAndNil(AData) сам объект может быть и убивал, но значение nil присваивал переменной AData.
Так что скорее всего дебаггер промахнулся, как это иногда бывает, и ругался он не на Synchronize, а на CheckUrlProc.
Ответить с цитированием