Отображение экрана-заставки в Delphi, когда основной поток занят

Комбу недавно принял обязательство требовать, чтобы amqp> = 2.4.0, < 3.0. Возврат к amqp v2.3.2 решает эту проблему. Я бы предложил использовать Kombu v4.2.1 вместо v4.2.2.post1.

12
задан menjaraz 12 January 2012 в 13:44
поделиться

5 ответов

Можно выполнить экран-заставку в другом потоке, но затем необходимо будет использовать необработанный Windows API calls или стороннюю библиотеку (как Библиотека Ключевых объектов), который реализует подобные VCL классы. Однако не получайте доступ к материалу VCL от потока всплеска.

Если Вы идете тем путем (который я не думаю, что Вы должны, поскольку это - большая работа для небольшого усиления), несомненно, будут наблюдать правила о доступе Windows API от нескольких потоков. Google, например, для "пользовательского интерфейса распараллеливает" для получения дополнительной информации.

Править:

Я не знал о нем прежде, но существует на самом деле компонент, реализовывая Потоковый Splashscreen для Delphi на CodeCentral. Используя этот компонент это может (не пробовать его) на самом деле быть легким иметь экран-заставку в другом потоке, но предупреждение против доступа VCL от вторичных потоков остается.

9
ответ дан 2 December 2019 в 20:20
поделиться

Создайте Вас экран-заставка в DPR сначала, но не используйте Приложение. Метод CreateForm для него. Вот некоторый простой код:

begin
  Application.Initialize;
  SplashForm := TSplashForm.Create(nil);
  try
    SplashForm.FormStyle := fsStayOnTop;
    SplashForm.Show;
    Application.ProcessMessages;
    Application.CreateForm(TForm14, Form14);
    // Other Form Creation here . . . .
    Application.Run;
  finally
    if assigned(SplashForm) then
      SplashForm.Release;
  end;
end.

Затем поместите следующий код в Выставочный обработчик событий (или позже - когда Ваша инициализация будет сделана) для Вашего MainFrom (в этом случае Form14):

SplashForm.Close;
SplashForm.Release;
SplashForm := nil;

(Вы разъединение вызова на форме вместо Свободного, и Вы присваиваете его нолю так, чтобы DRP не называл выпуск снова. Выпуск в DRP является на всякий случай Вашими сбоями mainform для создания.)

Так как Вашей формой всплеска является FormStyle: = fsStayOnTop это не должна быть проблема, что это не получает сообщения краски когда Ваши основные блоки потока. Затем, когда основной поток разблокирует Вас, отправляют ему сообщение обновления (для изменения индикатора выполнения, и т.д.), Хотя я соглашаюсь с Gamecat, что Вы могли бы хотеть связаться со своими сторонними поставщиками компонента и заставить их прекращать блокировать основной поток на Вас.

Кроме того, Вы могли создать свои сторонние компоненты в отдельном потоке (если они не визуальны, поскольку это было бы немного более трудно.)

Это будет работать с Приложением. MainFormOnTaskBar устанавливают на истинный также.

3
ответ дан 2 December 2019 в 20:20
поделиться

Я создаю всплеск в коде запуска, с поверх остальных окон набором, и затем использую frmSplash. Обновление в соответствующих местах для обеспечения его видимо и обновлено. Основная форма создает, одно такое место для вызова его.

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

0
ответ дан 2 December 2019 в 20:20
поделиться

У Jim McKeeth есть прекрасная идея там, но он не обращается к одной вещи, которая может или не может быть проблемой. Вы говорите о компонентах, занимающих много времени для инициализации. Этим Вы имеете в виду раздел инициализации или что-то, что происходит позже, как то, в то время как Ваши формы создаются? Поскольку все разделы инициализации, выполненные перед любым кодом в DPR, выполняются. Это, который взятие части долгое время, необходимо будет сделать некоторый хитрый материал, чтобы заставить экран-заставку разоблачать перед всем этим:

Поместите единицу формы как близко к вершине.DPR, как Вы можете. (Но не перед вещами, которые должны пойти сначала, как FastMM). Поместите код для показа экрана-заставки в разделе инициализации той единицы. И удостоверьтесь, что нет никаких единиц с долгими периодами инициализации, которые использует Ваш экран-заставка (или что те, которые используют его использование... или где угодно в дереве зависимостей.) И затем надеюсь что работы.

Если проблемы замедления не запускаются, пока начальная стопка инициализации не закончена, тем не менее, затем идут с тем, что сказал Jim.

0
ответ дан 2 December 2019 в 20:20
поделиться

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

Он, который не изменяет экран-заставка, это не проблема.

Возможно, необходимо связаться сторонним поставщиком компонента, потому что длинный блок как этот является настоящей проблемой.

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

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