Size: a a a

2020 December 01

DB

Dmitry Belkevich in Delphi & Lazarus
TList<TClass> вполне подойдет
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Вооот, а как у меня поток может увидеть класс FGetSM... , который создается в классе формы=другом классе?
источник

DB

Dmitry Belkevich in Delphi & Lazarus
ссылку потоку на контейнер передай
источник

VA

Viktor Akselrod in Delphi & Lazarus
Сергей Пятыгин
Вооот, а как у меня поток может увидеть класс FGetSM... , который создается в классе формы=другом классе?
1) передать эти объекты как есть
2) делегировать создание/разрушение этих объектов потоку
источник

DB

Dmitry Belkevich in Delphi & Lazarus
либо контейнер вообще на стороне потока выполнить
источник

DB

Dmitry Belkevich in Delphi & Lazarus
для более надежной работы, к слову, лучше будет использовать TThreadList<TClass> как контейнер
источник

AS

Alexey Shumkin in Delphi & Lazarus
Viktor Akselrod
1) передать эти объекты как есть
2) делегировать создание/разрушение этих объектов потоку
2.1: один из способов - через интерфейсы 😁
источник

AS

Alexey Shumkin in Delphi & Lazarus
zamtmn
в погоне за красотой ты ничего не добъешся. комута поподьи нравятся а комута прошмондели с инстаграма
Ну, мы инженеры всё-таки...
Мы должны выбирать ОПТИМАЛЬНОЕ решение по нескольким критериям :)
источник

AS

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

AS

Alexey Shumkin in Delphi & Lazarus
Sergey Bodrov
Нет, они все нормально тестировали, работу отдельных функций и методов. Но юнит-тесты не могут проверить работу приложения в целом.
См "пирамида тестирования"
источник

AS

Alexey Shumkin in Delphi & Lazarus
Sergey Bodrov
Мне от предшественника досталась куча юнит-тестов, там кода было больше, чем в основном проекте. И хотя тесты проходили успешно, система дико тормозила и глючила. То есть, с точки зрения программиста все хорошо, а с точки зрения пользователя прога виснет или падает каждые полчаса работы. Чье мнение важнее начальству? =)
Это не значит, что они не нужны...
Из твоих же высказываний это сквозит...

Это говорит о том, что одних лишь юнит-тестов недостаточно
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Я конечно понимаю что утомляю, но, верно ли я понял идею:

FGetSM.Create; это с формы
FGetNLL.Create; это с формы
FGetNLC.Create; это с формы
TManiThread.Create(FGetSM, FGetNLL, FGetNLC, False)

Внутри TManiThread.Execute
FreeAndNil(FGetSM);
FreeAndNil(FGetNLL);
FreeAndNil(FGetNLC);
источник

Miss Очепятка... in Delphi & Lazarus
Сергей Пятыгин
Я конечно понимаю что утомляю, но, верно ли я понял идею:

FGetSM.Create; это с формы
FGetNLL.Create; это с формы
FGetNLC.Create; это с формы
TManiThread.Create(FGetSM, FGetNLL, FGetNLC, False)

Внутри TManiThread.Execute
FreeAndNil(FGetSM);
FreeAndNil(FGetNLL);
FreeAndNil(FGetNLC);
Это нарушает идеологию RAII
источник

DB

Dmitry Belkevich in Delphi & Lazarus
создай один класс, в котором храни все данные. экземпляры складывай в TThreadList<TClass>
источник

DB

Dmitry Belkevich in Delphi & Lazarus
если у тебя всегда только одни данные, то их вообще нет смысла создавать и разрушать в процессе работы программы. в начале - создал. в конце - разрушил
источник

z

zamtmn in Delphi & Lazarus
Alexey Shumkin
Ну, мы инженеры всё-таки...
Мы должны выбирать ОПТИМАЛЬНОЕ решение по нескольким критериям :)
да, я инженер. и предлагаю решение оптимальное по скорости достижения результата (в смысле получения работающей программы) и по накоплению практического опыта. а ты по каким?
источник

Miss Очепятка... 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
Данные между потоками копируются. Каждый поток работает со своей копией данных. И в определенный момент их синхронизируете.  Передавать данные между потоками лучше через функции. К примеру реализовав своими силами метод Assign - что переводится как присвоение.
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Miss Очепятка
Данные между потоками копируются. Каждый поток работает со своей копией данных. И в определенный момент их синхронизируете.  Передавать данные между потоками лучше через функции. К примеру реализовав своими силами метод Assign - что переводится как присвоение.
Спасибо, этот алгоритм понятен. Создал структура в гуи. Создал структуру в потоке. Они не зависимы друг от друга. Скопировал Структуру из гуи в структуру потока и работаешь с ними отдельно.
Но Виктор предложил другой вариант:
1) передать эти объекты как есть
2) делегировать создание/разрушение этих объектов потоку
Miss так не стоит делать из-за RAII или не верно интерпретировал?
источник

z

zamtmn in Delphi & Lazarus
так нестоит делать потому что ты заденешь чувства местных верующих, но если ты понимаешь что ты делаешь - разрешаю))
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Кошмар :)
источник