Пример кода №2
Участников: 5
Auslogics: работа и отзывы о работе :: Примеры тестовых работ :: Тестовые работы Delphi-программистов
Страница 1 из 1
Пример кода №2
- Код:
var
IconCreator: TThread;
...
if Assigned(IconCreator) then
begin
IconCreator.Terminate;
IconCreator.WaitFor;
IconCreator.Free;
IconCreator := nil;
end;
...
Вышеприведенный код показывает плохое знание стандартных классов и системных модулей. Во-первых, проверка Assigned, метод Free и операция := nil заменяется на один метод FreeAndNil, во-вторых, при уничтожении объекта потока в его деструкторе, по умолчанию, вызываются Terminate и WaitFor. В итоге, этот участок кода можно заменить на одну строчку кода, что существенно улучшает читаемость кода в целом.
Re: Пример кода №2
Конечно все зависит от задачи, но данный код может "заморозить" GUI. Как возможный вариант:
- Код:
IconCreator.FreeOnTerminate := True; IconCreator.OnTerminate := DoTerminate; ..... procedure TForm1.DoTerminate(Sender: TObject); begin IconCreator := nil; end;
SmartGuy- Сообщения : 5
Дата регистрации : 2015-11-20
Re: Пример кода №2
Данный код может "заморозить" GUI только в случае неправильной работы с потоками.
DELPHI team Auslogics- Сообщения : 11
Дата регистрации : 2015-11-21
Re: Пример кода №2
Ну начнем с того, что код в данном примере правильный с точки зрения скорости выполнения, он как раз оптимизирован скорости. Тот кто писал тест не понимает работы архитектуры процессора Intel и рекомендует использовать FreeAndNil. Увы ....Код вполне читабельный и КАК РАЗ! выявляет наоборот понимание программиста что он делает и зачем. А Само по себе использовать TThread в серьезных высоконагруженых приложених это красивая глупость.
MaxMix- Сообщения : 3
Дата регистрации : 2015-11-20
Re: Пример кода №2
Мы ищем специалистов для разработки коммерческого ПО.
Сэкономить 2 байта и 0.1% в ресурсах, но потратить 3 дня на поиск багов - нецелесообразно в рамках ограниченности времени и бюджета.
Тем более, что в деструкторе все равное будут сделаны все необходимые проверки для уничтожения потока. Так зачем дополнительно вставлять 4-ре лишних вызова.
TThread это просто обертка над WinAPI созданием потока не более того ...
Сэкономить 2 байта и 0.1% в ресурсах, но потратить 3 дня на поиск багов - нецелесообразно в рамках ограниченности времени и бюджета.
Тем более, что в деструкторе все равное будут сделаны все необходимые проверки для уничтожения потока. Так зачем дополнительно вставлять 4-ре лишних вызова.
А что бы Вы посоветовали использовать?MaxMix пишет: Само по себе использовать TThread в серьезных высоконагруженых приложених это красивая глупость.
TThread это просто обертка над WinAPI созданием потока не более того ...
DELPHI team Auslogics- Сообщения : 11
Дата регистрации : 2015-11-21
Re: Пример кода №2
Не согласен выводами в примере.
Для потока может быть назначен обработчик события OnTerminate, внутри которого возможно обращение к IconCreator. Возможно, это сделано в коде выше и будет сделано при будущих правках. При замене на FreeAndNil переменная IconCreator в обработчике будет равна nil, что вызовет AV $00000000.
Для потока может быть назначен обработчик события OnTerminate, внутри которого возможно обращение к IconCreator. Возможно, это сделано в коде выше и будет сделано при будущих правках. При замене на FreeAndNil переменная IconCreator в обработчике будет равна nil, что вызовет AV $00000000.
ZiProdj- Сообщения : 1
Дата регистрации : 2015-11-21
Re: Пример кода №2
обращение к глобальной переменной (IconCreator) в событии потока некорректно и может приводить к ошибкам, если данное событие и назначается, то в нем необходимо использовать передаваемый параметр (Sender) для обращения к объекту потока.
DELPHI team Auslogics- Сообщения : 11
Дата регистрации : 2015-11-21
Auslogics: работа и отзывы о работе :: Примеры тестовых работ :: Тестовые работы Delphi-программистов
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|