Конференция "Прочее" » Подскажите способ реализации
 
  • дед Маздай © (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-форм, ибо со времен ЦГ известно о потоконебезопасности оных.
  • MsGuns © (22.01.09 16:08) [20]
    Вместо того, чтобы прочитав [5] задуматься, ищем способы сделать ожидание "красивым".
    Между тем, приложения, которые грузятся по 10 мин (исключая "тяжелые" игрушки), как правило, быстро выкидываются на свалку.

    Как типичный пример, существует немерянное кол-во прог, которые при загрузке упорно качают чего-то из баз, создают кучу форм и т.д. А между тем приложение может быть запущено просто случайно. Вот сидит такой незадачливый пользователь перед вошедшим в ступор компом и думает "Что за сволочь придумала такое г.."
  • дед Маздай © (22.01.09 16:17) [21]

    > MsGuns ©   (22.01.09 16:08) [20]

    Я не буду с вами спротить о том, что нужно или не нужно. Вы не имеете ни малейшего представления о том, что за программа, что она делает, что происходит при инициализации и зачем это нужно.

    > Сергей М. ©   (22.01.09 15:56) [19]
    > Отдельный поток, создающий окно...

    Хорошо попробую. А что вы думаете по поводу пунктов 3 и 4 из поста [18] Котик Б?
  • pasha_golub © (22.01.09 16:22) [22]

    > MsGuns ©   (22.01.09 16:08) [20]


    > А между тем приложение может быть запущено просто случайно.
    >  Вот сидит такой незадачливый пользователь перед вошедшим
    > в ступор компом и думает "Что за сволочь придумала такое
    > г.."

    Поддерживаю товарища. Главное стартануть. А уж все остальное можно подключать, открывать потом по ходу.
  • Дед Маздай © (22.01.09 16:34) [23]

    > pasha_golub ©   (22.01.09 16:22) [22]

    И с вами, Павел, я тоже не буду спорить =)
  • Сергей М. © (22.01.09 16:55) [24]

    > дед Маздай ©   (22.01.09 16:17) [21]


    А это как раз из той же самой оперы, что и [19].

    Толко вот насчет п.4 не соглашусь.

    Если тебе не шашечки нужны, а ехать требуется, то понижать до idle приоритет потока, выполняющего основную работу, по меньшей мере неразумно.
  • Котик Б (22.01.09 17:20) [25]

    > Сергей М. ©   (22.01.09 16:55) [24]
    > Если тебе не шашечки нужны, а ехать требуется, то понижать до idle приоритет потока, выполняющего основную работу, по меньшей мере неразумно

    Зато анимация тормозить не будет.

    Это ведь не сложно проверить экспериментально...  И вы сами удивитесь что в большинстве случаев идла хватает с головой на всё - особенно если в КриейтФорм используются таймаут-зависимые методы типа подключения к БД и т.п.

    PS: Не всё то что неразумно = неправильно. А иногда даже наоборот ;)

    PSS: Забыл добавить - как будете делать рефреш окна, перекройте ВМ_ИрейзБекграунд на всякий случай.
  • дед Маздай © (22.01.09 17:21) [26]

    > Сергей М. ©   (22.01.09 16:55) [24]
    > Если тебе не шашечки нужны

    Я тоже так думал.
  • Сергей М. © (22.01.09 19:48) [27]

    > дед Маздай ©   (22.01.09 17:21) [26]


    А теперь передумал ?)
    Нужней шашечки ?)
  • MsGuns © (23.01.09 08:29) [28]
    >дед Маздай ©   (22.01.09 16:17) [21]
    >Я не буду с вами спротить о том, что нужно или не нужно. Вы не имеете ни >малейшего представления о том, что за программа, что она делает, что >происходит при инициализации и зачем это нужно.

    Я и не спорю вообще-то. Просто пытаюсь подсказать, что машина, которой чтобы поехать нужно пять человек и десять минут, будет востребована в одном-разъединственном случае - если эта машина - стратегический бомбардировщик.

    Возможно, именно его вы и проектируете. Бог и Сергей М в помощь
  • Котик Б (23.01.09 08:47) [29]

    > MsGuns ©   (23.01.09 08:29) [28]
    > Возможно, именно его вы и проектируете. Бог и Сергей М в помощь

    Надеюсь, бог это я ? :)
  • ketmar © (23.01.09 10:42) [30]
    >[18] Котик Б (2009-01-22 15:24:00)
    >Главной нити поставить приоритет = идл.

    как хорошо, что я никогда не увижу это «приложение»…

    ---
    All Your Base Are Belong to Us
  • Котик Б (23.01.09 15:30) [31]

    > ketmar ©   (23.01.09 10:42) [30]
    > как хорошо, что я никогда не увижу это «приложение»…

    Судя по исчезновению автора из темы - вы его никогда и не увидите :)))
    А что не так с идлом то ?
  • дед Маздай © (23.01.09 15:47) [32]

    > Котик Б   (23.01.09 15:30) [31]
    > Судя по исчезновению автора из темы

    Ну почему же. Я здесь. Я слежу за всеми вами =)

    А то, что кетмар не увидит этого приложения даже и к лучшему. А то забрызгал бы меня слюной от восторга, а сам бы желчью отравился.
  • Anatoly Podgoretsky © (23.01.09 15:49) [33]
    > дед Маздай  (23.01.2009 15:47:32)  [32]

    Так это ты Большой брат!
  • ketmar © (23.01.09 16:21) [34]
    >[31] Котик Б (2009-01-23 15:30:00)
    >А что не так с идлом то ?

    а может, и вообще тогда основной поток заморозить? нафиг он сдался, главное — на сплэше анимация крутится!

    ---
    All Your Base Are Belong to Us
  • Котик Б (23.01.09 16:45) [35]
    Удалено модератором
  • ketmar © (23.01.09 19:05) [36]
    Удалено модератором
 
Конференция "Прочее" » Подскажите способ реализации
Есть новые Нет новых   [134453   +31][b:0][p:0.035]