Цитата:
В твоем варианте реализации тред просто выполняет задание и завершается (в смысле, когда больше заданий нет), а не ждет когда они появятся.
|
Собственно так и было задумано. Было два варианта: или оставлять потоки крутить цикл 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.