-
Есть желание, даже, скорее нужда, реализовать показ формы при загрузке приложения и поскольку приложение грузится долго, то должна быть какая-нибудь анимация на форме. Собственно форму реализовал, а вот с анимацией проблемы... Т.к. при создании основной формы происходят события, которые я не могу контролировать, например подключение/активация БД, инициализация компонентов и т.п., то происходит подвисание анимации, чего хотелось бы избежать. Выкидывание процедуры создания формы в отдельный поток приводит к ошибкам от меня не зависящим, мало понятным и не поддающимся исправлению с мои уровнем знаний. Выкидывание анимации в отдельный поток не дает нужного результата, т.к. обработка сообщений также замирает на время, в следствии чего замирает анимация. Я еще обдумывал вариант создания отдельного процесса, но создавать процесс в памяти я не пробовал и не представляю затрат, а выгрузить процесс из рерурса и запустить отдельно... Мне кажется, уже это само действо займет много времени.
Подскажите еще возможные методы реализации такой задумки.
-
> Выкидывание анимации в отдельный поток не дает нужного результата, > т.к. обработка сообщений также замирает на время, в следствии > чего замирает анимация
см. 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-форм, ибо со времен ЦГ известно о потоконебезопасности оных.
-
Вместо того, чтобы прочитав [5] задуматься, ищем способы сделать ожидание "красивым". Между тем, приложения, которые грузятся по 10 мин (исключая "тяжелые" игрушки), как правило, быстро выкидываются на свалку.
Как типичный пример, существует немерянное кол-во прог, которые при загрузке упорно качают чего-то из баз, создают кучу форм и т.д. А между тем приложение может быть запущено просто случайно. Вот сидит такой незадачливый пользователь перед вошедшим в ступор компом и думает "Что за сволочь придумала такое г.."
-
> MsGuns © (22.01.09 16:08) [20]
Я не буду с вами спротить о том, что нужно или не нужно. Вы не имеете ни малейшего представления о том, что за программа, что она делает, что происходит при инициализации и зачем это нужно.
> Сергей М. © (22.01.09 15:56) [19] > Отдельный поток, создающий окно...
Хорошо попробую. А что вы думаете по поводу пунктов 3 и 4 из поста [18] Котик Б?
-
> MsGuns © (22.01.09 16:08) [20]
> А между тем приложение может быть запущено просто случайно. > Вот сидит такой незадачливый пользователь перед вошедшим > в ступор компом и думает "Что за сволочь придумала такое > г.."
Поддерживаю товарища. Главное стартануть. А уж все остальное можно подключать, открывать потом по ходу.
-
> pasha_golub © (22.01.09 16:22) [22]
И с вами, Павел, я тоже не буду спорить =)
-
> дед Маздай © (22.01.09 16:17) [21]
А это как раз из той же самой оперы, что и [19].
Толко вот насчет п.4 не соглашусь.
Если тебе не шашечки нужны, а ехать требуется, то понижать до idle приоритет потока, выполняющего основную работу, по меньшей мере неразумно.
-
> Сергей М. © (22.01.09 16:55) [24] > Если тебе не шашечки нужны, а ехать требуется, то понижать до idle приоритет потока, выполняющего основную работу, по меньшей мере неразумно
Зато анимация тормозить не будет.
Это ведь не сложно проверить экспериментально... И вы сами удивитесь что в большинстве случаев идла хватает с головой на всё - особенно если в КриейтФорм используются таймаут-зависимые методы типа подключения к БД и т.п.
PS: Не всё то что неразумно = неправильно. А иногда даже наоборот ;)
PSS: Забыл добавить - как будете делать рефреш окна, перекройте ВМ_ИрейзБекграунд на всякий случай.
-
> Сергей М. © (22.01.09 16:55) [24] > Если тебе не шашечки нужны
Я тоже так думал.
-
> дед Маздай © (22.01.09 17:21) [26]
А теперь передумал ?) Нужней шашечки ?)
-
>дед Маздай © (22.01.09 16:17) [21] >Я не буду с вами спротить о том, что нужно или не нужно. Вы не имеете ни >малейшего представления о том, что за программа, что она делает, что >происходит при инициализации и зачем это нужно.
Я и не спорю вообще-то. Просто пытаюсь подсказать, что машина, которой чтобы поехать нужно пять человек и десять минут, будет востребована в одном-разъединственном случае - если эта машина - стратегический бомбардировщик.
Возможно, именно его вы и проектируете. Бог и Сергей М в помощь
-
> MsGuns © (23.01.09 08:29) [28] > Возможно, именно его вы и проектируете. Бог и Сергей М в помощь
Надеюсь, бог это я ? :)
-
>[18] Котик Б (2009-01-22 15:24:00) >Главной нити поставить приоритет = идл. как хорошо, что я никогда не увижу это «приложение»…
--- All Your Base Are Belong to Us
-
> ketmar © (23.01.09 10:42) [30] > как хорошо, что я никогда не увижу это «приложение»…
Судя по исчезновению автора из темы - вы его никогда и не увидите :))) А что не так с идлом то ?
-
> Котик Б (23.01.09 15:30) [31] > Судя по исчезновению автора из темы
Ну почему же. Я здесь. Я слежу за всеми вами =)
А то, что кетмар не увидит этого приложения даже и к лучшему. А то забрызгал бы меня слюной от восторга, а сам бы желчью отравился.
-
> дед Маздай (23.01.2009 15:47:32) [32]
Так это ты Большой брат!
-
>[31] Котик Б (2009-01-23 15:30:00) >А что не так с идлом то ? а может, и вообще тогда основной поток заморозить? нафиг он сдался, главное — на сплэше анимация крутится!
--- All Your Base Are Belong to Us
-
Удалено модератором
-
Удалено модератором
|