Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.29;
Скачать: CL | DM;

Вниз

Подскажите способ реализации   Найти похожие ветки 

 
дед Маздай ©   (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
 { &#207;&#240;&#238;&#226;&#229;&#240;&#234;&#224; &#231;&#224;&#239;&#243;&#249;&#229;&#237;&#237;&#238;&#233; &#234;&#238;&#239;&#232;&#232; &#239;&#240;&#238;&#227;&#240;&#224;&#236;&#236;&#251;. }
 if CheckOpenProgram then
   Exit;
 { &#200;&#237;&#232;&#246;&#232;&#224;&#235;&#232;&#231;&#224;&#246;&#232;&#255; &#239;&#240;&#232;&#235;&#238;&#230;&#229;&#237;&#232;&#255;. }
 Application.Initialize;
 Application.CreateForm(TfmBalance, fmBalance);
 fmBalance.Hide;
 fmSplash := TfmSplash.Create(nil);
 with fmSplash do
   try
     Show;
     lbText.Caption := "&#207;&#238;&#228;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#229; &#236;&#238;&#228;&#243;&#235;&#255; &#228;&#224;&#237;&#237;&#251;&#245;...";
     Refresh;
     Application.CreateForm(Tdm, dm);
     lbText.Caption := "&#207;&#229;&#240;&#229;&#228;&#224;&#247;&#224; &#241;&#242;&#240;&#238;&#234;&#232; &#241;&#238;&#229;&#228;&#232;&#237;&#229;&#237;&#232;&#255; &#241; &#193;&#196;...";
     Refresh;
     dm.Connection.ConnectionString := "FILE NAME=" + GetPathUdlFile;
     lbText.Caption := "&#211;&#241;&#242;&#224;&#237;&#238;&#226;&#234;&#224; &#241;&#238;&#229;&#228;&#232;&#237;&#229;&#237;&#232;&#255; &#241; &#193;&#196;...";
     Refresh;
     if OpenConnection(dm.Connection) then
       begin
         lbText.Caption := "&#192;&#226;&#242;&#238;&#240;&#232;&#231;&#224;&#246;&#232;&#255;...";
         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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.024 c
1-1208189486
Бэтман
2008-04-14 20:11
2009.03.29
Компонент tRadioGroup


15-1232784590
Кое кто
2009-01-24 11:09
2009.03.29
Чем читать файл *.RM?


2-1233732829
проходил мимо решил зайти
2009-02-04 10:33
2009.03.29
Сортировка данных таблице


1-1208421010
Petrovich
2008-04-17 12:30
2009.03.29
Показ формы из компонента


15-1233155675
Чудак
2009-01-28 18:14
2009.03.29
Delphi for PHP