Пример кода №2

Предыдущая тема Следующая тема Перейти вниз

Пример кода №2

Сообщение автор Marina-T в Чт Ноя 05, 2015 10:31 pm

Код:

var
IconCreator: TThread;
...
if Assigned(IconCreator) then
begin
IconCreator.Terminate;
IconCreator.WaitFor;
IconCreator.Free;
IconCreator := nil;
end;
...

Вышеприведенный код показывает плохое знание стандартных классов и системных модулей. Во-первых, проверка Assigned, метод Free и операция := nil заменяется на один метод FreeAndNil, во-вторых, при уничтожении объекта потока в его деструкторе, по умолчанию, вызываются Terminate и WaitFor. В итоге, этот участок кода можно заменить на одну строчку кода, что существенно улучшает читаемость кода в целом.
avatar
Marina-T
Admin

Сообщения : 33
Дата регистрации : 2015-11-04
Возраст : 31

Посмотреть профиль http://auslogics.online-talk.net

Вернуться к началу Перейти вниз

Re: Пример кода №2

Сообщение автор SmartGuy в Пн Ноя 23, 2015 10:06 pm

Конечно все зависит от задачи, но данный код может "заморозить" GUI. Как возможный вариант:
Код:
 IconCreator.FreeOnTerminate := True; IconCreator.OnTerminate := DoTerminate; ..... procedure TForm1.DoTerminate(Sender: TObject); begin IconCreator := nil; end;

SmartGuy

Сообщения : 5
Дата регистрации : 2015-11-20

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №2

Сообщение автор DELPHI team Auslogics в Вт Ноя 24, 2015 10:40 pm

Данный код может "заморозить" GUI только в случае неправильной работы с потоками.
avatar
DELPHI team Auslogics

Сообщения : 11
Дата регистрации : 2015-11-21

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №2

Сообщение автор MaxMix в Вт Ноя 24, 2015 10:51 pm

Ну начнем с того, что код в данном примере правильный с точки зрения скорости выполнения, он как раз оптимизирован скорости. Тот кто писал тест не понимает работы архитектуры процессора Intel и рекомендует использовать FreeAndNil. Увы Sad....Код вполне читабельный и КАК РАЗ! выявляет наоборот понимание программиста что он делает и зачем. А Само по себе использовать TThread в серьезных высоконагруженых приложених это красивая глупость.

MaxMix

Сообщения : 3
Дата регистрации : 2015-11-20

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №2

Сообщение автор DELPHI team Auslogics в Ср Ноя 25, 2015 10:28 pm

Мы ищем специалистов для разработки коммерческого ПО.
Сэкономить 2 байта и 0.1% в ресурсах, но потратить 3 дня на поиск багов - нецелесообразно в рамках ограниченности времени и бюджета.
Тем более, что в деструкторе все равное будут сделаны все необходимые проверки для уничтожения потока. Так зачем дополнительно вставлять 4-ре лишних вызова.

@MaxMix пишет: Само по себе использовать TThread в серьезных высоконагруженых приложених это красивая глупость.
А что бы Вы посоветовали использовать?
TThread это просто обертка над WinAPI созданием потока не более того ...
avatar
DELPHI team Auslogics

Сообщения : 11
Дата регистрации : 2015-11-21

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №2

Сообщение автор ZiProdj в Пт Ноя 27, 2015 1:04 am

Не согласен выводами в примере.
Для потока может быть назначен обработчик события OnTerminate, внутри которого возможно обращение к IconCreator. Возможно, это сделано в коде выше и будет сделано при будущих правках. При замене на FreeAndNil переменная IconCreator в обработчике будет равна nil, что вызовет AV $00000000.

ZiProdj

Сообщения : 1
Дата регистрации : 2015-11-21

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №2

Сообщение автор DELPHI team Auslogics в Ср Дек 02, 2015 8:55 pm

обращение к глобальной переменной (IconCreator) в событии потока некорректно и может приводить к ошибкам, если данное событие и назначается, то в нем необходимо использовать передаваемый параметр (Sender) для обращения к объекту потока.
avatar
DELPHI team Auslogics

Сообщения : 11
Дата регистрации : 2015-11-21

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №2

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения