Создание формы Delphi, не замораживая основной поток

Оказывается, причина, по которой HTMLEntitiesToUnicode() не работал для меня, заключалась в том, что я читал данные из файла .json, в который были записаны данные, без указания того, что они должны быть сохранены в utf-8. Исправление и последующее использование HTMLEntititesToUnicode(), как описано выше, работало нормально.

9
задан QAZ 3 February 2009 в 17:07
поделиться

8 ответов

Создание форм в потоке просто не будет работать. VCL и особенно визуальная часть, не ориентированы на многопотоковое исполнение. Разочаруйтесь в той идее и вместо этого оптимизируйте код, который заставляет форму занимать много времени для создания. Вы не сказали нам, какова медленная часть. Если можно ответить, что, возможно, мы можем предложить метод ускорения его.

В целом не возможно сделать хорошее задание улучшения производительности части кода, пока Вы не представили его и знаете точно, какова проблема. Иначе Вы просто тратите впустую свое время.

26
ответ дан 4 December 2019 в 06:27
поделиться

Как Riho указывает, создание формы не должно занимать время. Что может занять время, хотя, весь код, Вы вставляете конструктора или OnCreate-событие той формы.

Представьте свой код как предложенный Craig, так, чтобы Вы знали, какой код поднимает большую часть времени. Затем посмотрите, можно ли переместить часть того кода в отдельный поток.

4
ответ дан 4 December 2019 в 06:27
поделиться

Решение не будет легко, как

  1. Delphi VCL не ориентирован на многопотоковое исполнение
  2. создание окон в другом потоке требует, чтобы соответствующий поток имел цикл сообщения

Вам нужны все формы сразу? В противном случае Вы могли задержать создание ко времени, где приложение неактивно (т.е. TApplicationEvents. OnIdle). Или просто отобразите хороший индикатор выполнения :)

6
ответ дан 4 December 2019 в 06:27
поделиться

Как выше, необходимо создать формы в потоке VCL. НО, Вы не должны делать всего там:

Если Ваши формы имеют много данных изображения, Вы могли бы удалить это из форм, и поместить его в файл ресурсов (или просто использовать необработанные файлы изображений),

В конструкторе Вашей формы запустите фоновый поток, чтобы считать данные изображения из ресурсов и сделать любые другие медленные вещи. Переопределите свое событие OnShow форм, чтобы гарантировать, что оно ожидает фонового потока для завершения, прежде чем форма будет отображена.

1
ответ дан 4 December 2019 в 06:27
поделиться

Просто поместите PostMessage на формы OnCreate и wirite процедура по форме для обработки постсообщения. Таким образом весь код, который занимает время, можно пихнуть из метода OnCreate. Я действительно соглашаюсь, хотя, только создайте форму, когда она необходима, и затем действительно реализуйте некоторую логику, чтобы решить если Ваша попытка освободить ее на завершение, или нет.. В зависимости от времени загрузки и шанса, что пользователь захочет это снова..

Выдумка Jens, Archersoft

1
ответ дан 4 December 2019 в 06:27
поделиться

Я не могу вообразить то, что заняло бы много времени в создании формы, для которого будут нужны потоки для разрешения. Если это - огромный объем данных, затем пытаются ограничить сумму, показанную первоначально.

0
ответ дан 4 December 2019 в 06:27
поделиться

Это - ярлык, который использовали мы, прежде для форм, которые имеют большой процесс, чтобы сделать на, создают. Отбросьте TTimer на форме и установите ее на ложь. OnCreate формы включают его. Затем поместите весь код, который Вы имели в OnCreate в Событие OnTimer. Установка Интервала к 250 - 500 достаточно.

Это не изящные решения, но его простое.

0
ответ дан 4 December 2019 в 06:27
поделиться

существуют некоторые большие формы там, как я сказал ранее. файл DFM похож на 3 МБ (включая данные изображения, конечно). Я на самом деле думаю, что большая часть времени создания происходит из-за этого, а не выполненного кода. Но возможно плохо разделение их и создает их, когда приложение неактивно, текущее время загрузки не является действительно большим (как 4 или 5 секунд), но плохо изучите его. спасибо за Ваши ответы.

0
ответ дан 4 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: