Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
 { &#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.072 c
3-1217475458
wsv
2008-07-31 07:37
2009.03.29
Проверить системный DSN


2-1233948726
AkimOS
2009-02-06 22:32
2009.03.29
Консольное приложение


1-1208178791
Версия для печати
2008-04-14 17:13
2009.03.29
Как сменить цвет заголовка колонок ListView?


2-1234181007
Andrewtitoff
2009-02-09 15:03
2009.03.29
как организовать цикл по датам


15-1233131001
Palladin
2009-01-28 11:23
2009.03.29
Работа программ на Delphi 2009





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский