Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Быстрое создание форм  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
В проекте создается 200 инстансов одной формы (тяжелое наследие) примерно таким кодом
for i := 0 to 200 do
  MyForm := TMyForm.Create;


В итоге на это все уходит 12 секунд. "Тормозит" метод ReadState. Т.е. непосредственно вычитывание формы из dfm. Можно это как-то ускорить?

Про создавать одну форму и перенастраивать ее знаю. Когда-то сделаю. Создавать форму при первом обращении к ней, пожалуй, еще сложнее, чем создавать одну. Тяжелый легаси код. Сейчас интересует именно как ускорить чтение dfm. Может Можно как-то клонировать уже созданную форму?

С уважением, Vasilisk
6 фев 20, 15:06    [22074819]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
DimaBr
Member

Откуда:
Сообщений: 11496
Повесить окно "Загрузка форм"
Это значительно ускорит процесс чтения
6 фев 20, 15:08    [22074823]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
DimaBr
Повесить окно "Загрузка форм"
Это значительно ускорит процесс чтения
Это в смысле шутка такая? Чтобы пользователь не нервничал?
6 фев 20, 15:09    [22074828]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
DimaBr
Member

Откуда:
Сообщений: 11496
Если 200 форм не видны на экране, то зачем их создавать ?
Проще потратить время на вычистку Автосоздаваемых форм, чтем пытаться что-то изменить
6 фев 20, 15:10    [22074829]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
DimaBr
Проще потратить время на вычистку Автосоздаваемых форм, чтем пытаться что-то изменить
Они не в автосоздаваемых формах
DimaBr
Если 200 форм не видны на экране, то зачем их создавать ?
Каждая форма привязана к управляющему объекту. И для каждого объекта создается своя форма. Потом показывается форма для выбранного объекта. При изменении состояния объекта он изменяет что-то на своей форме.

Еще раз
_Vasilisk_
Про создавать одну форму и перенастраивать ее знаю. Когда-то сделаю.
6 фев 20, 15:18    [22074840]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6599
_Vasilisk_
Сейчас интересует именно как ускорить чтение dfm


вы точно уверены, что именно чтение .dfm занимает столько время, а не пост-обработка?

Возможно, там дело в датасетах, у которых свойство .Active = true. Или еще что-нибудь долгое происходит в конструкторе.
6 фев 20, 15:23    [22074848]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1411
_Vasilisk_,

создавать контролы в рантайме?
6 фев 20, 15:24    [22074850]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
vavan
Member

Откуда: Казань
Сообщений: 3474
_Vasilisk_
Чтобы пользователь не нервничал?
да, за наблюдением анимации прогресса им возможно будет комфортнее
6 фев 20, 15:27    [22074858]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
Кроик Семён
вы точно уверены, что именно чтение .dfm занимает столько время, а не пост-обработка?
Да. Основное время это между вызовом ReadState и до вызова Loaded
Кроик Семён
Возможно, там дело в датасетах,
Их на форме нет вообще
Кроик Семён
Или еще что-нибудь долгое происходит в конструкторе.
FormCreate для всех форм в сумме выполняется за 600 миллисекунд
6 фев 20, 15:28    [22074859]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
vavan
Member

Откуда: Казань
Сообщений: 3474
_Vasilisk_, автовыравнивание/сайзинг контролов на форме используется?
6 фев 20, 15:30    [22074861]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
vavan
автовыравнивание/сайзинг контролов на форме используется?
Да. Массово
6 фев 20, 15:39    [22074873]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
vavan
Member

Откуда: Казань
Сообщений: 3474
_Vasilisk_
Да. Массово
думаю это скорости тоже не добавляет
6 фев 20, 15:43    [22074879]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
DimaBr
Member

Откуда:
Сообщений: 11496
Не лечите йодом, лучше рубите.
Лучше день потерять, потом за 5 минут долететь.
6 фев 20, 15:47    [22074886]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
vavan
думаю это скорости тоже не добавляет
По исходникам как бы так
procedure TCustomForm.ReadState(Reader: TReader);
var
  NewTextHeight: Integer;
  Scaled: Boolean;
begin
  DisableAlign;
  try
    ..............
    inherited ReadState(Reader);
    ..............
  finally
    EnableAlign;
  end;
end;
6 фев 20, 15:49    [22074890]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
DimaBr
Не лечите йодом, лучше рубите.
Да похоже, что все к тому идет
6 фев 20, 15:50    [22074892]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
DimaBr
Member

Откуда:
Сообщений: 11496
Каждая форма привязана к управляющему объекту. И для каждого объекта создается своя форма. Потом показывается форма для выбранного объекта. При изменении состояния объекта он изменяет что-то на своей форме

Мне это напоминает пост про шестиугольники.
Вместо того чтобы нарисовать 200 объектов на одной канве, человек создаёт 200 контролов, потому что ОДИН нужно двигать

Сообщение было отредактировано: 6 фев 20, 15:53
6 фев 20, 15:51    [22074893]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60873
_Vasilisk_> В проекте создается 200 инстансов одной формы (тяжелое наследие)

В сторону - меня всегда удивляли дебри, в которых ты
оказываешься и пытаешься выбраться. Это то прежнее
место работы или уже новое?

_Vasilisk_> "Тормозит" ... вычитывание формы из dfm. Можно это как-то ускорить?

Можно, вариантов несколько.

1. Переработать архитектуру от вычитывания 200 форм.
При чём вряд ли "не создавать одну и перенастраивать" -
ибо тогда все объекты будут в очереди к 1 инстансу?
Я бы скорее предложил создавать (вычитывать из dfm) 1
форму, а потом в цикле создавать новые чистые инстансы
и клонировать/копировать в них первую форму.

2. Сделать своего наследника, который читать будет не из
dfm, а из своего стрима - с учетом файлового кеша не знаю
насколько это ускорит, но проверить как вариант можно.

3. Сделать своего наследника, который будет не читать из
dfm, а тупо клонировать объект, переданный параметром -
этакая вариация п.1.

_Vasilisk_> Создавать форму при первом обращении к ней,
_Vasilisk_> пожалуй, еще сложнее, чем создавать одну.

Это я не понял.

_Vasilisk_> Может Можно как-то клонировать уже созданную форму?

Конечно, можно. RTTI, например. В последних версиях и
готовые методы появились, наверное.

Posted via ActualForum NNTP Server 1.5

6 фев 20, 16:16    [22074917]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 60759
Блог
_Vasilisk_
В проекте создается 200 инстансов одной формы (тяжелое наследие)

Я не спрашиваю, кто это придумал - и так ясно, что инопланетянин. Но мне очень интересно - зачем? Какую задачу он решал таким образом?

_Vasilisk_
"Тормозит" метод ReadState.

Точно он сам? Или таки выполнение различных методов свойств и прочих инициализаций из него?

_Vasilisk_
Т.е. непосредственно вычитывание формы из dfm. Можно это как-то ускорить

Единственное, что мне приходит в голову - взять из Classes.pas исходники TReader и на их основе сделать свой reader, применяющий каждую считанную строчку к 200-м формам разом.
6 фев 20, 16:27    [22074922]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
Гаджимурадов Рустам
Это то прежнее место работы или уже новое?
Прежнее. Проект огромен и куски рефракторятся только если прижмет и есть свободное время.
Гаджимурадов Рустам
При чём вряд ли "не создавать одну и перенастраивать" - ибо тогда все объекты будут в очереди к 1 инстансу?
Там даже очередей не нужно будет. Нет формы - ничего не делаем. Только потом когда форма у объекта появится ее нужно будет довести до текущего состояния объекта
Гаджимурадов Рустам
Я бы скорее предложил создавать (вычитывать из dfm) 1 форму, а потом в цикле создавать новые чистые инстансы и клонировать/копировать в них первую форму.
Вот этого и хочу. RTFM что?
Гаджимурадов Рустам
2. Сделать своего наследника, который читать будет не из dfm, а из своего стрима - с учетом файлового кеша не знаю насколько это ускорит, но проверить как вариант можно.
А смысл? Если dfm тянется из ресурсов экзешника, который уже загружен в память. Где здесь вообще файловая система?
Гаджимурадов Рустам
_Vasilisk_> Создавать форму при первом обращении к ней,
_Vasilisk_> пожалуй, еще сложнее, чем создавать одну.
Это я не понял
function TMyObject.GetForm: TMyForm;
begin
  if  FForm = nil then
    FForm := TMyForm.Create(nil);
  Result := FForm;
end;

Гаджимурадов Рустам
Конечно, можно. RTTI, например
И куда смотреть? Тупо рекурсивно перебирать все published свойства и копировать их с эталона?
Гаджимурадов Рустам
В последних версиях и готовые методы появились, наверное.
Пока XE3
6 фев 20, 16:32    [22074928]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 60759
Блог
Гаджимурадов Рустам
_Vasilisk_> Может Можно как-то клонировать уже созданную форму?

Конечно, можно. RTTI, например. В последних версиях и
готовые методы появились, наверное.

Я думаю, коллеге стоит уточнить вопрос: "Можно ли клонировать уже созданную форму так, чтобы это получилось быстрее, чем десериализацией?"
6 фев 20, 16:34    [22074931]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
softwarer
Но мне очень интересно - зачем? Какую задачу он решал таким образом?
Независимость отображения каждого объекта. На старте проекта объектов было не более 10.
softwarer
Точно он сам?
Ну как точно? В Classes тайминги особо не поставишь. Смотрю по двум чекпойнам: вызов TForm.ReadState и вызов TForm.Loaded. По идее, вся инициализация должна происходить в методе Loaded
6 фев 20, 16:39    [22074935]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 60759
Блог
_Vasilisk_
Ну как точно? В Classes тайминги особо не поставишь.

Думаю, если скомпилировать с отладочными dcu, AQTime ответил на этот вопрос. А так очень легко может быть, что оптимизироваться будет то, что и так проскакивает за доли секунды.

_Vasilisk_
Смотрю по двум чекпойнам: вызов TForm.ReadState и вызов TForm.Loaded. По идее, вся инициализация должна происходить в методе Loaded

Это какая-то в высшей степени странная идея.
6 фев 20, 16:44    [22074943]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60873
_Vasilisk_> Вот этого и хочу. RTFM что? И куда смотреть?
_Vasilisk_> Тупо рекурсивно перебирать все published свойства
_Vasilisk_> и копировать их с эталона?

Типа того, там несложно. Примеры приводились и у нас IIRC,
и на SO наверняка есть. Я помню упоминания, что соотв. код
есть где-то и внутрях VCL (или RTL), но в каком методе -
искать лень. Для примера https://habr.com/en/post/204678


_Vasilisk_> А смысл? Если dfm тянется из ресурсов экзешника, который
_Vasilisk_> уже загружен в память. Где здесь вообще файловая система?

Ну да, считай то же самое. Я думал ты их снаружи (из БД и пр.)
читаешь, собираешь. Тогда забудь.

Posted via ActualForum NNTP Server 1.5

6 фев 20, 16:47    [22074949]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60873
softwarer> чтобы это получилось быстрее, чем десериализацией?"

Это довольно редкая прикладная задача: если кто-то не
сталкивался с ней реально - вряд ли сможет подсказать точно.

Posted via ActualForum NNTP Server 1.5

6 фев 20, 16:48    [22074951]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание форм  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
softwarer
AQTime
Где его искать? Он вроде установлен, но я нигде его не вижу
6 фев 20, 16:55    [22074959]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Delphi Ответить