Форум: "Прочее";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];
ВнизПодскажите способ реализации Найти похожие ветки
← →
дед Маздай © (2009-01-22 14:24) [0]Есть желание, даже, скорее нужда, реализовать показ формы при загрузке приложения и поскольку приложение грузится долго, то должна быть какая-нибудь анимация на форме. Собственно форму реализовал, а вот с анимацией проблемы... Т.к. при создании основной формы происходят события, которые я не могу контролировать, например подключение/активация БД, инициализация компонентов и т.п., то происходит подвисание анимации, чего хотелось бы избежать.
Выкидывание процедуры создания формы в отдельный поток приводит к ошибкам от меня не зависящим, мало понятным и не поддающимся исправлению с мои уровнем знаний.
Выкидывание анимации в отдельный поток не дает нужного результата, т.к. обработка сообщений также замирает на время, в следствии чего замирает анимация.
Я еще обдумывал вариант создания отдельного процесса, но создавать процесс в памяти я не пробовал и не представляю затрат, а выгрузить процесс из рерурса и запустить отдельно... Мне кажется, уже это само действо займет много времени.
Подскажите еще возможные методы реализации такой задумки.
← →
Сергей М. © (2009-01-22 14:28) [1]
> Выкидывание анимации в отдельный поток не дает нужного результата,
> т.к. обработка сообщений также замирает на время, в следствии
> чего замирает анимация
см. TAnimate.Timers = False
← →
Дед Маздай © (2009-01-22 14:35) [2]
> Сергей М. © (22.01.09 14:28) [1]
Анимация написана собственными силами, есть только таймер в котором и поисходит вывод нарисованного.
Или вы предлагаете посмотреть реализацию TAnimate.Timers?
← →
Дед Маздай © (2009-01-22 14:42) [3]Сорри, под словом анимация, в первом посте, следут понимать форма с реализованой на ней анимацией.
← →
Василий Жогарев © (2009-01-22 14:48) [4]
> дед Маздай © (22.01.09 14:24)
Описывать небуду, но смысл в том что на форму Splash выводится текст происходящего события (подключение, загрузка и т.д.)
Попробуй чтонить вроде этого... (Вдаваться в подробности не стоит...) за код ногами не бить... )))program Balance;
uses
Forms,
uMain in "uMain.pas" {fmBalance},
uDm in "uDm.pas" {dm: TDataModule},
uConstants in "Units\uConstants.pas",
uMyUnit in "Units\uMyUnit.pas",
uSplash in "uSplash.pas" {fmSplash},
SysUtils,
IniFiles,
uDbs in "Units\uDbs.pas",
Windows,
uLogin in "uLogin.pas" {fmLogin},
uDialog in "uDialog.pas" {fmDialog},
uMessage in "uMessage.pas" {fmMessage},
uCard in "uCard.pas" {fmCard},
uHandBook in "uHandBook.pas" {fmHandBook};
{$R *.res}
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
//Application.Terminate;
end;
end
else
begin
//Application.Terminate;
end;
finally
Free;
end;
Application.Run;
end.
← →
Sergey13 © (2009-01-22 14:48) [5]> [0] дед Маздай © (22.01.09 14:24)
> Т.к. при создании основной формы происходят события, которые
> я не могу контролировать, например подключение/активация
> БД
Я так предполагаю, что открываются и закачиваютя на клиента ВСЕ датасеты, создаются ВСЕ формы с выполнением кода и т.д.
Так вот для запуска программы это ВСЕ не нужно. А коннект и создание 1 формы занимает обычно мизер времени.
← →
Котик Б (2009-01-22 14:53) [6]Если для вас анимация сплеша важнее загрузки приложения - то треду сплеша ставите наивысший приоритет, а главному потоку - идл. После загрузки восстановите до нормал.
← →
Дед Маздай © (2009-01-22 14:57) [7]
> Василий Жогарев © (22.01.09 14:48) [4]
У вас сплэш создается после создания формы balance, а у меня сплэш должен висеть все время создания формы.
> Sergey13 © (22.01.09 14:48) [5]
Мне кажется, что это не относится к теме обсуждения. Делается ВСЕ, что нужно для непосредственного запуска приложения.
← →
Дед Маздай © (2009-01-22 14:59) [8]
> Котик Б (22.01.09 14:53) [6]
Нельзя ли поподробнее. Не совсем понял про главный поток.
← →
Сергей М. © (2009-01-22 15:03) [9]
> Дед Маздай © (22.01.09 14:59) [8]
Ты когда сотворял свою сплеш-форму, разве не знал об этой "проблеме" ?
← →
Германн © (2009-01-22 15:08) [10]
> У вас сплэш создается после создания формы balance, а у
> меня сплэш должен висеть все время создания формы.
>
Стандартный пример из поставки Дельфи не подходит?
← →
Дед Маздай © (2009-01-22 15:09) [11]
> Сергей М. © (22.01.09 15:03) [9]
=)
Догадывался, но думал, что решу. Ведь делают же как-то, Nero 9, например.
← →
Василий Жогарев © (2009-01-22 15:12) [12]
> Дед Маздай © (22.01.09 14:57) [7]
>
>
> > Василий Жогарев © (22.01.09 14:48) [4]
>
> У вас сплэш создается после создания формы balance, а у
> меня сплэш должен висеть все время создания формы.
Так у тебя полюбому, основная (базавая) форма должна создаться иначе, если ты первым создаш сплаш, потом его все равно выгружать придется, и у тебя приложение просто напросто закроется...
← →
Василий Жогарев © (2009-01-22 15:14) [13]
> Ведь делают же как-то, Nero 9, например.
))) так так и делают как большинство примеров...
← →
Дед Маздай © (2009-01-22 15:15) [14]
> Германн © (22.01.09 15:08) [10]
К сожалению нет.
← →
Сергей М. © (2009-01-22 15:15) [15]
> Ведь делают же как-то, Nero 9, например.
А что, Nero использует для этого дельфийскую VCL-форму ?
← →
Дед Маздай © (2009-01-22 15:21) [16]
> Василий Жогарев © (22.01.09 15:12) [12]
> Так у тебя полюбому, основная (базавая)
> форма должна создаться иначе, если ты первым создаш сплаш,
> потом его все равно выгружать придется, и у тебя приложение
> просто напросто закроется...
"Спокойно, товарищ" (с)
Изучаем, хотя бы..., ну хотя бы, это пример "Borland\Delphi7\Demos\Db\IBMastApp\"
← →
Дед Маздай © (2009-01-22 15:23) [17]
> Сергей М. © (22.01.09 15:15) [15]
А что, если реализовать свою очередь сообщений, то основной поток не будет ее тормозить, в рамках одного процесса?
← →
Котик Б (2009-01-22 15:24) [18]
> Дед Маздай © (22.01.09 15:15)
Всё очень просто - когда вы запускаете свой процесс, у вас автоматически в этом процессе создаётся главная нить, в которой собственно и работает основной цикл выборки сообщений.
Для того чтобы сделать красівый анімірованый сплэш вам нужно
1. Создать еще одну нить с приоритетом = риалтайм.
2. В этой нити создать окно (не форму) черезCreateWindowEx
с собственым циклом обработки сообщений.
3. Рефрешить это окно с частотой 10-15 кадров в секунду, через таймер, ММтаймер или просто слиип.
4. Главной нити поставить приоритет = идл.
5. После загрузки всех форм окно сплеша уничтожить.
← →
Сергей М. © (2009-01-22 15:56) [19]
> Дед Маздай © (22.01.09 15:23) [17]
Угу.
Отдельный поток, создающий окно и, соотв-но, ответсвенный за ожидание/выборку/дисп-ю сообщений этому окну.
Но это окно не должно иметь ничего общего с окнами дельфийских VCL-форм, ибо со времен ЦГ известно о потоконебезопасности оных.
← →
MsGuns © (2009-01-22 16:08) [20]Вместо того, чтобы прочитав [5] задуматься, ищем способы сделать ожидание "красивым".
Между тем, приложения, которые грузятся по 10 мин (исключая "тяжелые" игрушки), как правило, быстро выкидываются на свалку.
Как типичный пример, существует немерянное кол-во прог, которые при загрузке упорно качают чего-то из баз, создают кучу форм и т.д. А между тем приложение может быть запущено просто случайно. Вот сидит такой незадачливый пользователь перед вошедшим в ступор компом и думает "Что за сволочь придумала такое г.."
← →
дед Маздай © (2009-01-22 16:17) [21]
> MsGuns © (22.01.09 16:08) [20]
Я не буду с вами спротить о том, что нужно или не нужно. Вы не имеете ни малейшего представления о том, что за программа, что она делает, что происходит при инициализации и зачем это нужно.
> Сергей М. © (22.01.09 15:56) [19]
> Отдельный поток, создающий окно...
Хорошо попробую. А что вы думаете по поводу пунктов 3 и 4 из поста [18] Котик Б?
← →
pasha_golub © (2009-01-22 16:22) [22]
> MsGuns © (22.01.09 16:08) [20]
> А между тем приложение может быть запущено просто случайно.
> Вот сидит такой незадачливый пользователь перед вошедшим
> в ступор компом и думает "Что за сволочь придумала такое
> г.."
Поддерживаю товарища. Главное стартануть. А уж все остальное можно подключать, открывать потом по ходу.
← →
Дед Маздай © (2009-01-22 16:34) [23]
> pasha_golub © (22.01.09 16:22) [22]
И с вами, Павел, я тоже не буду спорить =)
← →
Сергей М. © (2009-01-22 16:55) [24]
> дед Маздай © (22.01.09 16:17) [21]
А это как раз из той же самой оперы, что и [19].
Толко вот насчет п.4 не соглашусь.
Если тебе не шашечки нужны, а ехать требуется, то понижать до idle приоритет потока, выполняющего основную работу, по меньшей мере неразумно.
← →
Котик Б (2009-01-22 17:20) [25]
> Сергей М. © (22.01.09 16:55) [24]
> Если тебе не шашечки нужны, а ехать требуется, то понижать до idle приоритет потока, выполняющего основную работу, по меньшей мере неразумно
Зато анимация тормозить не будет.
Это ведь не сложно проверить экспериментально... И вы сами удивитесь что в большинстве случаев идла хватает с головой на всё - особенно если в КриейтФорм используются таймаут-зависимые методы типа подключения к БД и т.п.
PS: Не всё то что неразумно = неправильно. А иногда даже наоборот ;)
PSS: Забыл добавить - как будете делать рефреш окна, перекройте ВМ_ИрейзБекграунд на всякий случай.
← →
дед Маздай © (2009-01-22 17:21) [26]
> Сергей М. © (22.01.09 16:55) [24]
> Если тебе не шашечки нужны
Я тоже так думал.
← →
Сергей М. © (2009-01-22 19:48) [27]
> дед Маздай © (22.01.09 17:21) [26]
А теперь передумал ?)
Нужней шашечки ?)
← →
MsGuns © (2009-01-23 08:29) [28]>дед Маздай © (22.01.09 16:17) [21]
>Я не буду с вами спротить о том, что нужно или не нужно. Вы не имеете ни >малейшего представления о том, что за программа, что она делает, что >происходит при инициализации и зачем это нужно.
Я и не спорю вообще-то. Просто пытаюсь подсказать, что машина, которой чтобы поехать нужно пять человек и десять минут, будет востребована в одном-разъединственном случае - если эта машина - стратегический бомбардировщик.
Возможно, именно его вы и проектируете. Бог и Сергей М в помощь
← →
Котик Б (2009-01-23 08:47) [29]
> MsGuns © (23.01.09 08:29) [28]
> Возможно, именно его вы и проектируете. Бог и Сергей М в помощь
Надеюсь, бог это я ? :)
← →
ketmar © (2009-01-23 10:42) [30]>[18] Котик Б (2009-01-22 15:24:00)
>Главной нити поставить приоритет = идл.
как хорошо, что я никогда не увижу это «приложение»…
---
All Your Base Are Belong to Us
← →
Котик Б (2009-01-23 15:30) [31]
> ketmar © (23.01.09 10:42) [30]
> как хорошо, что я никогда не увижу это «приложение»…
Судя по исчезновению автора из темы - вы его никогда и не увидите :)))
А что не так с идлом то ?
← →
дед Маздай © (2009-01-23 15:47) [32]
> Котик Б (23.01.09 15:30) [31]
> Судя по исчезновению автора из темы
Ну почему же. Я здесь. Я слежу за всеми вами =)
А то, что кетмар не увидит этого приложения даже и к лучшему. А то забрызгал бы меня слюной от восторга, а сам бы желчью отравился.
← →
Anatoly Podgoretsky © (2009-01-23 15:49) [33]> дед Маздай (23.01.2009 15:47:32) [32]
Так это ты Большой брат!
← →
ketmar © (2009-01-23 16:21) [34]>[31] Котик Б (2009-01-23 15:30:00)
>А что не так с идлом то ?
а может, и вообще тогда основной поток заморозить? нафиг он сдался, главное — на сплэше анимация крутится!
---
All Your Base Are Belong to Us
← →
Котик Б (2009-01-23 16:45) [35]Удалено модератором
← →
ketmar © (2009-01-23 19:05) [36]Удалено модератором
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.048 c