2009-02-03 5 views
9

У меня возникли проблемы с чем-то, что я хочу сделать. У меня есть некоторые большие формы, которые требуют времени для создания. Чтобы ускорить загрузку приложения, я подумал о том, чтобы позволить создавать формы в потоке, который создается в событии OnCreate основной формы. В потоке есть поле FApplication типа TApplication, которое, очевидно, является переменной Application. Я использую его для создания формы на резьбе, но даже то я попробовалСоздание формы Delphi без замораживания основной темы

FApplication.CreateForm (TfrmXXX, frmXXX) 

и

frmXXX := TFrmXXX.Create(FApplication) 

формы еще Арент созданных. Есть ли обходной путь для этого?

Заранее спасибо.

ответ

26

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

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

+1

Фактически, создание окна в потоке, отличном от основного потока пользовательского интерфейса, является вполне законной идеей в Win32, которая использует ее. Это не имеет ничего общего с тем, что «VCL является потокобезопасным». Если я хочу иметь 3 потока каждый со своим собственным контуром сообщений, зачем нужен VCL? Петли сообщений не должны разговаривать друг с другом, они находятся в разных контекстах (т. Е. Нет проблем с безопасностью потоков). –

+2

Милан, окно Win32 <> Форма VCL. Он хочет форму VCL, и вы просто не можете этого сделать, как бы вы этого ни хотели. –

6

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

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

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

+0

Я проголосовал за этот ответ, указав, что вам не нужно создавать все формы сразу, но индикатор прогресса будет подталкивать меня к стене, как пользователь. :) –

+1

Да, в основном я чувствую то же самое. Но если при запуске неизбежно выполнять длительные операции, лучше иметь один, чем нет. Однажды я забыл показать один, и клиенты прекратили приложение, потому что они думали, что он висит: -/Но в любом случае - вы, безусловно, правы, предлагая дальнейшую оптимизацию. –

0

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

4

Как указывает Рихо, создание формы не должно занять много времени. Однако может потребоваться время, это весь код, который вы добавили в конструктор или событие OnCreate этой формы.

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

0

Это ярлык, который мы использовали ранее для форм, для которых требуется много процесса создания. Поместите TTimer в форму и установите для нее значение false. OnCreate формы разрешить его. Затем поместите весь код, который у вас был в OnCreate, в событие OnTimer. Достаточно установить интервал до 250-500.

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

0

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

1

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

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

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

1

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

Jens Fudge, Archersoft