-
Есть желание, даже, скорее нужда, реализовать показ формы при загрузке приложения и поскольку приложение грузится долго, то должна быть какая-нибудь анимация на форме. Собственно форму реализовал, а вот с анимацией проблемы... Т.к. при создании основной формы происходят события, которые я не могу контролировать, например подключение/активация БД, инициализация компонентов и т.п., то происходит подвисание анимации, чего хотелось бы избежать. Выкидывание процедуры создания формы в отдельный поток приводит к ошибкам от меня не зависящим, мало понятным и не поддающимся исправлению с мои уровнем знаний. Выкидывание анимации в отдельный поток не дает нужного результата, т.к. обработка сообщений также замирает на время, в следствии чего замирает анимация. Я еще обдумывал вариант создания отдельного процесса, но создавать процесс в памяти я не пробовал и не представляю затрат, а выгрузить процесс из рерурса и запустить отдельно... Мне кажется, уже это само действо займет много времени.
Подскажите еще возможные методы реализации такой задумки.
-
> Выкидывание анимации в отдельный поток не дает нужного результата, > т.к. обработка сообщений также замирает на время, в следствии > чего замирает анимация
см. TAnimate.Timers = False
-
> Сергей М. © (22.01.09 14:28) [1]
Анимация написана собственными силами, есть только таймер в котором и поисходит вывод нарисованного. Или вы предлагаете посмотреть реализацию TAnimate.Timers?
-
Сорри, под словом анимация, в первом посте, следут понимать форма с реализованой на ней анимацией.
-
> дед Маздай © (22.01.09 14:24)
Описывать небуду, но смысл в том что на форму Splash выводится текст происходящего события (подключение, загрузка и т.д.) Попробуй чтонить вроде этого... (Вдаваться в подробности не стоит...) за код ногами не бить... ))) program Balance;
uses
Forms,
uMain in 'uMain.pas' ,
uDm in 'uDm.pas' ,
uConstants in 'Units\uConstants.pas',
uMyUnit in 'Units\uMyUnit.pas',
uSplash in 'uSplash.pas' ,
SysUtils,
IniFiles,
uDbs in 'Units\uDbs.pas',
Windows,
uLogin in 'uLogin.pas' ,
uDialog in 'uDialog.pas' ,
uMessage in 'uMessage.pas' ,
uCard in 'uCard.pas' ,
uHandBook in 'uHandBook.pas' ;
var
HM: THandle;
fmSplash: TfmSplash;
fmLogin: TfmLogin;
Rec: TLogin;
function CheckOpenProgram: Boolean;
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, False, 'TfmBalance');
Result := (HM <> 0);
if HM = 0 then
HM := CreateMutex(nil, False, 'TfmBalance');
end;
begin
if CheckOpenProgram then
Exit;
Application.Initialize;
Application.CreateForm(TfmBalance, fmBalance);
fmBalance.Hide;
fmSplash := TfmSplash.Create(nil);
with fmSplash do
try
Show;
lbText.Caption := 'Ïîäêëþ÷åíèå ìîäóëÿ äàííûõ...';
Refresh;
Application.CreateForm(Tdm, dm);
lbText.Caption := 'Ïåðåäà÷à ñòðîêè ñîåäèíåíèÿ ñ ÁÄ...';
Refresh;
dm.Connection.ConnectionString := 'FILE NAME=' + GetPathUdlFile;
lbText.Caption := 'Óñòàíîâêà ñîåäèíåíèÿ ñ ÁÄ...';
Refresh;
if OpenConnection(dm.Connection) then
begin
lbText.Caption := 'Àâòîðèçàöèÿ...';
Refresh;
Rec.ShowType := slBegin;
if CreateLogin(Application, Rec) then
begin
end
else
begin
end;
end
else
begin
end;
finally
Free;
end;
Application.Run;
end.
-
> [0] дед Маздай © (22.01.09 14:24) > Т.к. при создании основной формы происходят события, которые > я не могу контролировать, например подключение/активация > БД
Я так предполагаю, что открываются и закачиваютя на клиента ВСЕ датасеты, создаются ВСЕ формы с выполнением кода и т.д. Так вот для запуска программы это ВСЕ не нужно. А коннект и создание 1 формы занимает обычно мизер времени.
-
Если для вас анимация сплеша важнее загрузки приложения - то треду сплеша ставите наивысший приоритет, а главному потоку - идл. После загрузки восстановите до нормал.
-
> Василий Жогарев © (22.01.09 14:48) [4]
У вас сплэш создается после создания формы balance, а у меня сплэш должен висеть все время создания формы.
> Sergey13 © (22.01.09 14:48) [5]
Мне кажется, что это не относится к теме обсуждения. Делается ВСЕ, что нужно для непосредственного запуска приложения.
-
> Котик Б (22.01.09 14:53) [6]
Нельзя ли поподробнее. Не совсем понял про главный поток.
-
> Дед Маздай © (22.01.09 14:59) [8]
Ты когда сотворял свою сплеш-форму, разве не знал об этой "проблеме" ?
-
> У вас сплэш создается после создания формы balance, а у > меня сплэш должен висеть все время создания формы. >
Стандартный пример из поставки Дельфи не подходит?
-
> Сергей М. © (22.01.09 15:03) [9]
=) Догадывался, но думал, что решу. Ведь делают же как-то, Nero 9, например.
-
> Дед Маздай © (22.01.09 14:57) [7] > > > > Василий Жогарев © (22.01.09 14:48) [4] > > У вас сплэш создается после создания формы balance, а у > меня сплэш должен висеть все время создания формы.
Так у тебя полюбому, основная (базавая) форма должна создаться иначе, если ты первым создаш сплаш, потом его все равно выгружать придется, и у тебя приложение просто напросто закроется...
-
> Ведь делают же как-то, Nero 9, например.
))) так так и делают как большинство примеров...
-
> Германн © (22.01.09 15:08) [10]
К сожалению нет.
-
> Ведь делают же как-то, Nero 9, например.
А что, Nero использует для этого дельфийскую VCL-форму ?
-
> Василий Жогарев © (22.01.09 15:12) [12] > Так у тебя полюбому, основная (базавая) > форма должна создаться иначе, если ты первым создаш сплаш, > потом его все равно выгружать придется, и у тебя приложение > просто напросто закроется...
"Спокойно, товарищ" (с) Изучаем, хотя бы..., ну хотя бы, это пример "Borland\Delphi7\Demos\Db\IBMastApp\"
-
> Сергей М. © (22.01.09 15:15) [15]
А что, если реализовать свою очередь сообщений, то основной поток не будет ее тормозить, в рамках одного процесса?
-
> Дед Маздай © (22.01.09 15:15)
Всё очень просто - когда вы запускаете свой процесс, у вас автоматически в этом процессе создаётся главная нить, в которой собственно и работает основной цикл выборки сообщений. Для того чтобы сделать красівый анімірованый сплэш вам нужно 1. Создать еще одну нить с приоритетом = риалтайм. 2. В этой нити создать окно (не форму) через CreateWindowEx с собственым циклом обработки сообщений. 3. Рефрешить это окно с частотой 10-15 кадров в секунду, через таймер, ММтаймер или просто слиип. 4. Главной нити поставить приоритет = идл. 5. После загрузки всех форм окно сплеша уничтожить.
-
> Дед Маздай © (22.01.09 15:23) [17]
Угу. Отдельный поток, создающий окно и, соотв-но, ответсвенный за ожидание/выборку/дисп-ю сообщений этому окну. Но это окно не должно иметь ничего общего с окнами дельфийских VCL-форм, ибо со времен ЦГ известно о потоконебезопасности оных.
|