Size: a a a

2020 December 01

SB

Sergey Bodrov in Delphi & Lazarus
Вот какой юнит-тест определит, что проблемы из-за избытка Application.ProcessMessages ?
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Sergey Bodrov
Предлагаю сделать в классе метод Assign(), который копирует все свойства экземпляра класса в другой экземпляр того же класса. В идеале внутри Assign используется CriticalSection. При создании потока, внутри Execute создавать отдельный экземпляр класса, и снаружи потока (из кнопки формы, нпример) делать Assign данных из класса данных формы в класс данных потока. Или наоборот, Assign данных из потока в форму.
Те если популярно, берем ClassForm с данными из гуи,  берем класс ClassThread. Из ClassForm делаем Assign в ClassThread, делаем свои "чистые" дела в Thread. Таким образом отделяем ClassForm от потока, и даже если мы его удалим до завершения ClassThread, никто не расстроиться, если он не нужен по окончании Thread. Ну а далее по аналогичной схеме возвращаем из потока в гуи аналогичным методом, через специальные классы?
источник

VA

Viktor Akselrod in Delphi & Lazarus
Сергей Пятыгин
Поделитесь опытом по отделению представления от модели.

Вот конкретный пример:
Есть два юнита=модели (классы с наследниками).
1. u_systemmagnetic

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_systemmagnetic.pas#L1

2. u_noload

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_noload.pas#L1

Есть юнит представление u_main

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_main.pas#L1

Есть контроллер, в виде класса-потока TMainThread в u_main.

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_main.pas#L42

Не могу понять, является это полным разделением модель-представление-контроллер или нет.
С одной стороны, u_systemmagnetic и u_noload полностью независимы, не содержат в implementation uses с u_main и могут быть подвергнуты ЮнитТестированию.
С другой стороны, контроллер находиться в одном юните с представлением и представление содержит в interface uses ссылки на u_systemmagnetic и u_noload.
А если контроллера вынести в отдельный юнит (u_main в uses будет содержать некий u_thread, а  u_thread в uses будет содержать u_systemmagnetic и u_noload), то как ему передать данные из представления, ведь в новом юните ему будут не видны классы представления (и опять возникнет вопрос который возник ранее-где освободить классы данных переданные в контролер из представления)?

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_main.pas#L139
https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_main.pas#L1

ни в коем случае нельзя работать с визуальными контролами из вторичного потока
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Viktor Akselrod
https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_main.pas#L1

ни в коем случае нельзя работать с визуальными контролами из вторичного потока
Спасибо! Буду разделять. Можете рекомендовать альтернативу разделения через  Assign, как говориться, хочется посмотреть всех...
источник

VA

Viktor Akselrod in Delphi & Lazarus
Сергей Пятыгин
Спасибо! Буду разделять. Можете рекомендовать альтернативу разделения через  Assign, как говориться, хочется посмотреть всех...
не обязательно копировать данные.
можно просто их заполнить в основной форме и затем уже передать потоку на расчет.
емнип, изначально именно про этот вариант и шла речь
источник

z

zamtmn in Delphi & Lazarus
По второму кругу пошли))
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
zamtmn
По второму кругу пошли))
Нет, первый круг не завершен :)
источник

RS

Renat Suleymanov in Delphi & Lazarus
И это только первый из девяти )
источник

МС

Максим Сысоев... in Delphi & Lazarus
Сергей Пятыгин
Спасибо, идея ясна. Но неужели эти затраты времени на создание тестов, даже в контексте TDD себя оправдывают, для больших приложений?
только эти тесты так впадлу писать 😭
источник

KB

Kit Bayun in Delphi & Lazarus
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Viktor Akselrod
не обязательно копировать данные.
можно просто их заполнить в основной форме и затем уже передать потоку на расчет.
емнип, изначально именно про этот вариант и шла речь
Данные заполнены в основной форме.
источник

VA

Viktor Akselrod in Delphi & Lazarus
Сергей Пятыгин
Данные заполнены в основной форме.
я про
   FGetSM: TGetSystemMagnetic;
   FSetSM: TSetSystemMagnetic;
   FGetNLL: TGetNoLoadLosses;
   FGetNLC: TGetNoLoadCurrent;
   FSM: TSM;
   FNLL: TNLL;
   FNLC: TNLC;

это должно заполняться в основной форме из ГУИ
источник

SB

Sergey Bodrov in Delphi & Lazarus
Сергей Пятыгин
Те если популярно, берем ClassForm с данными из гуи,  берем класс ClassThread. Из ClassForm делаем Assign в ClassThread, делаем свои "чистые" дела в Thread. Таким образом отделяем ClassForm от потока, и даже если мы его удалим до завершения ClassThread, никто не расстроиться, если он не нужен по окончании Thread. Ну а далее по аналогичной схеме возвращаем из потока в гуи аналогичным методом, через специальные классы?
Assign это по сути оператор := для присвоения значения из одной переменной в другую, только для классов. Обычно он работает с параметром того же типа, что и сам класс. Например, TStrings.Assign(ASource: TStrings)
источник

МС

Максим Сысоев... in Delphi & Lazarus
Kit Bayun
как правило, Дельфи использую внутри корпораций фирм, где работают 1-3 программиста над собственными внутренними продуктами. Т.е. одной копии вполне достаточно. Не видел я (почти не видел) фирм, где массово используют Дельфи для написания софта на продажу. Вот в Харькове есть Глобаллоджик, довольно огромная фирма и все, больше не видел.
на самом деле есть и их полно. Не все афишируют что на делфи работают
источник

МС

Максим Сысоев... in Delphi & Lazarus
Максим Сысоев
на самом деле есть и их полно. Не все афишируют что на делфи работают
https://cnapfree.kremen.org.ua/ - вот пример. И хрен поймешь что у них делфисты сидят в основном.

А система получилась одна из лучших в Украине. Если не лучшая
источник

KB

Kit Bayun in Delphi & Lazarus
Максим Сысоев
на самом деле есть и их полно. Не все афишируют что на делфи работают
ок
источник

KB

Kit Bayun in Delphi & Lazarus
ну, приятно слышать
источник

МС

Максим Сысоев... in Delphi & Lazarus
😂
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Viktor Akselrod
я про
   FGetSM: TGetSystemMagnetic;
   FSetSM: TSetSystemMagnetic;
   FGetNLL: TGetNoLoadLosses;
   FGetNLC: TGetNoLoadCurrent;
   FSM: TSM;
   FNLL: TNLL;
   FNLC: TNLC;

это должно заполняться в основной форме из ГУИ
В первой версии,  у меня возник ступор именно по этому.
Эти классы создавались в гуи и в них заносилась инфа с контролов.
         FGetSM: TGetSystemMagnetic;    
   FGetNLL: TGetNoLoadLosses;
   FGetNLC: TGetNoLoadCurrent;

Это уже классы модели, и они работают в потоке.
    FSM: TSM;
   FSetSM: TSetSystemMagnetic;-он тут для передачи данных из FSM в FNLL/FNLC виде 1 параметра, а не 100500 параметров
   FNLL: TNLL;
   FNLC: TNLC;

Но! Запуск потока:
FGetSM.Create;
FGetNLL.Create;
FGetNLC.Create;
try
 TManiThread.Create(False);-вот тут происходит ошибка, так как поток еще работает, а FGetSM... уже уничтожены
finally
 FreeAndNil(FGetSM);
 FreeAndNil(FGetNLL);
 FreeAndNil(FGetNLC);
end
источник

VA

Viktor Akselrod in Delphi & Lazarus
Сергей Пятыгин
В первой версии,  у меня возник ступор именно по этому.
Эти классы создавались в гуи и в них заносилась инфа с контролов.
         FGetSM: TGetSystemMagnetic;    
   FGetNLL: TGetNoLoadLosses;
   FGetNLC: TGetNoLoadCurrent;

Это уже классы модели, и они работают в потоке.
    FSM: TSM;
   FSetSM: TSetSystemMagnetic;-он тут для передачи данных из FSM в FNLL/FNLC виде 1 параметра, а не 100500 параметров
   FNLL: TNLL;
   FNLC: TNLC;

Но! Запуск потока:
FGetSM.Create;
FGetNLL.Create;
FGetNLC.Create;
try
 TManiThread.Create(False);-вот тут происходит ошибка, так как поток еще работает, а FGetSM... уже уничтожены
finally
 FreeAndNil(FGetSM);
 FreeAndNil(FGetNLL);
 FreeAndNil(FGetNLC);
end
тебе объясняли как сделать, в том числе я.
перечитай переписку
источник