Конференция "Прочее" » Подскажите способ реализации
 
  • дед Маздай © (22.01.09 14:24) [0]
    Есть желание, даже, скорее нужда, реализовать показ формы при загрузке приложения и поскольку приложение грузится долго, то должна быть какая-нибудь анимация на форме. Собственно форму реализовал, а вот с анимацией проблемы... Т.к. при создании основной формы происходят события, которые я не могу контролировать, например подключение/активация БД, инициализация компонентов и т.п., то происходит подвисание анимации, чего хотелось бы избежать.
    Выкидывание процедуры создания формы в отдельный поток приводит к ошибкам от меня не зависящим, мало понятным и не поддающимся исправлению с мои уровнем знаний.
    Выкидывание анимации в отдельный поток не дает нужного результата, т.к. обработка сообщений также замирает на время, в следствии чего замирает анимация.
    Я еще обдумывал вариант создания отдельного процесса, но создавать процесс в памяти я не пробовал и не представляю затрат, а выгрузить процесс из рерурса и запустить отдельно... Мне кажется, уже это само действо займет много времени.

    Подскажите еще возможные методы реализации такой задумки.
  • Сергей М. © (22.01.09 14:28) [1]

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


    см. TAnimate.Timers = False
  • Дед Маздай © (22.01.09 14:35) [2]

    > Сергей М. ©   (22.01.09 14:28) [1]

    Анимация написана собственными силами, есть только таймер в котором и поисходит вывод нарисованного.
    Или вы предлагаете посмотреть реализацию TAnimate.Timers?
  • Дед Маздай © (22.01.09 14:42) [3]
    Сорри, под словом анимация, в первом посте, следут понимать форма с реализованой на ней анимацией.
  • Василий Жогарев © (22.01.09 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 := 'Ïîäêëþ÷åíèå ìîäóëÿ äàííûõ...';
         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 © (22.01.09 14:48) [5]
    > [0] дед Маздай ©   (22.01.09 14:24)
    > Т.к. при создании основной формы происходят события, которые
    > я не могу контролировать, например подключение/активация
    > БД

    Я так предполагаю, что открываются и закачиваютя на клиента ВСЕ датасеты, создаются ВСЕ формы с выполнением кода и т.д.
    Так вот для запуска программы это ВСЕ не нужно. А коннект и создание 1 формы занимает обычно мизер времени.
  • Котик Б (22.01.09 14:53) [6]
    Если для вас анимация сплеша важнее загрузки приложения - то треду сплеша ставите наивысший приоритет, а главному потоку - идл. После загрузки восстановите до нормал.
  • Дед Маздай © (22.01.09 14:57) [7]

    > Василий Жогарев ©   (22.01.09 14:48) [4]

    У вас сплэш создается после создания формы balance, а у меня сплэш должен висеть все время создания формы.


    > Sergey13 ©   (22.01.09 14:48) [5]

    Мне кажется, что это не относится к теме обсуждения. Делается ВСЕ, что нужно для непосредственного запуска приложения.
  • Дед Маздай © (22.01.09 14:59) [8]

    > Котик Б   (22.01.09 14:53) [6]

    Нельзя ли поподробнее. Не совсем понял про главный поток.
  • Сергей М. © (22.01.09 15:03) [9]

    > Дед Маздай ©   (22.01.09 14:59) [8]


    Ты когда сотворял свою сплеш-форму, разве не знал об этой "проблеме" ?
  • Германн © (22.01.09 15:08) [10]

    > У вас сплэш создается после создания формы balance, а у
    > меня сплэш должен висеть все время создания формы.
    >

    Стандартный пример из поставки Дельфи не подходит?
  • Дед Маздай © (22.01.09 15:09) [11]

    > Сергей М. ©   (22.01.09 15:03) [9]

    =)
    Догадывался, но думал, что решу. Ведь делают же как-то, Nero 9, например.
  • Василий Жогарев © (22.01.09 15:12) [12]

    > Дед Маздай ©   (22.01.09 14:57) [7]
    >
    >
    > > Василий Жогарев ©   (22.01.09 14:48) [4]
    >
    > У вас сплэш создается после создания формы balance, а у
    > меня сплэш должен висеть все время создания формы.


    Так у тебя полюбому, основная (базавая) форма должна создаться иначе, если ты первым создаш сплаш, потом его все равно выгружать придется, и у тебя приложение просто напросто закроется...
  • Василий Жогарев © (22.01.09 15:14) [13]

    > Ведь делают же как-то, Nero 9, например.


    ))) так так и делают как большинство примеров...
  • Дед Маздай © (22.01.09 15:15) [14]

    > Германн ©   (22.01.09 15:08) [10]

    К сожалению нет.
  • Сергей М. © (22.01.09 15:15) [15]

    > Ведь делают же как-то, Nero 9, например.


    А что, Nero использует для этого дельфийскую VCL-форму ?
  • Дед Маздай © (22.01.09 15:21) [16]

    > Василий Жогарев ©   (22.01.09 15:12) [12]
    > Так у тебя полюбому, основная (базавая)
    > форма должна создаться иначе, если ты первым создаш сплаш,
    >  потом его все равно выгружать придется, и у тебя приложение
    > просто напросто закроется...

    "Спокойно, товарищ" (с)
    Изучаем, хотя бы..., ну хотя бы, это пример "Borland\Delphi7\Demos\Db\IBMastApp\"
  • Дед Маздай © (22.01.09 15:23) [17]

    > Сергей М. ©   (22.01.09 15:15) [15]

    А что, если реализовать свою очередь сообщений, то основной поток не будет ее тормозить, в рамках одного процесса?
  • Котик Б (22.01.09 15:24) [18]

    > Дед Маздай ©   (22.01.09 15:15)


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

    Для того чтобы сделать красівый анімірованый сплэш вам нужно
    1. Создать еще одну нить с приоритетом = риалтайм.
    2. В этой нити создать окно (не форму) через
    CreateWindowEx

    с собственым циклом обработки сообщений.
    3. Рефрешить это окно с частотой 10-15 кадров в секунду, через таймер, ММтаймер или просто слиип.
    4. Главной нити поставить приоритет = идл.
    5. После загрузки всех форм окно сплеша уничтожить.
  • Сергей М. © (22.01.09 15:56) [19]

    > Дед Маздай ©   (22.01.09 15:23) [17]


    Угу.
    Отдельный поток, создающий окно и, соотв-но, ответсвенный за ожидание/выборку/дисп-ю сообщений этому окну.
    Но это окно не должно иметь ничего общего с окнами дельфийских VCL-форм, ибо со времен ЦГ известно о потоконебезопасности оных.
 
Конференция "Прочее" » Подскажите способ реализации
Есть новые Нет новых   [134453   +34][b:0][p:0.004]