Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Вниз

прогресс при загрузке программы   Найти похожие ветки 

 
Maxim_S~~   (2004-12-09 11:51) [0]

Как реализовать это?
До того как происходит mainForm.create проходит время
и в процессе создания формы,
время - немалое, но где ловить проценты, или хотя бы шаги - непонятно.
жду ваших идей.


 
Digitman ©   (2004-12-09 12:08) [1]


> До того как происходит mainForm.create проходит время


и это время как правило тратится на создание экземпляров компонентов, "лежащих" на форме

отсюда и решение - перекрыть у формы метод Notification()


 
TUser ©   (2004-12-09 12:11) [2]


> жду ваших идей.

У меня есть идея - в Питер смотаться. Годится?


 
Maxim_S~~   (2004-12-09 12:12) [3]

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


 
Maxim_S~~   (2004-12-09 12:14) [4]

TUser ©   (09.12.04 12:11) [2]

смотаться в Питер для того чтобы показать мне как это делается?
что ж, можно..

а как ты догадался что я из Питера?


 
KSergey ©   (2004-12-09 12:33) [5]

> [3] Maxim_S~~   (09.12.04 12:12)
> создать дополнительный поток и в синхронизации он будет
> рисовать..

Теперь почитайте про метод Synhronyse и как он работает, чтобы такую чушь больше не городить.
> я в принципе не понимаю почему проходит так много времени
> при загрузке.

Вообще-то, никто кроме вас этого точно понять не сможет.
Хотя можно и погадать на кофейной гуще: базы данных используются? Компонентов много на автокрейтных формах?


 
Digitman ©   (2004-12-09 12:35) [6]


> мне важны не столько проценты, сколько показать процесс


смотря как показывать будешь.

если VCL-контролами - выбрось эту мысль из головы, эти контролы обновляются в осн.трэде процесса, который в этот момент занят загрузкой формы


> я в принципе не понимаю почему проходит так много времени
> при
> загрузке


это печально. очень печально.
и еще более печально, что ты считаешь, что все в округе должны быть телепатами, угадывающими на расстоянии что ты там понакидал на форму


 
TUser ©   (2004-12-09 12:37) [7]


> Maxim_S~~   (09.12.04 12:14) [4]

:)))
Просто я нифига не понял из твоего объяснения - то ли тебе SlpashWindow нужен с прогрессбаром, то ли еще чего ... Вот и предложил "идею".


 
Maxim_S~~   (2004-12-09 12:44) [8]

Digitman ©   (09.12.04 12:08) [1]

не совсем понял как это сделать.
я вижу у формы ряд tnotify events
onCreate ondestroy etc
но связяных с компонентами не вижу.

невозможно же писать для каждого компонетна событие onCreate,
да, которое и не предусмотрено как notify, нет такого
tbutton().oncreate

или ручками писать создание компонентов?

на форме куча панелей кнопок и прочей дряни,
customimagы и проч и проч.
неужели их создание может занимать так много времени?


 
TUser ©   (2004-12-09 12:48) [9]


> неужели их создание может занимать так много времени?

Может. Ты попробуй в цикле создать, скажем, 1000 кнопок. Для каждой надо создать окно, шрифт, браш, выделить кучу ресурсов, запустить оконную процедуру.


 
Maxim_S~~   (2004-12-09 12:52) [10]

KSergey ©   (09.12.04 12:33) [5]
> создать дополнительный поток и в синхронизации он будет
> рисовать..

Теперь почитайте про метод Synhronyse и как он работает, чтобы такую чушь больше не городить.

Syncronize
будет правильнее.

я давно знаком с методом syncronize и на мой вопрос уже ответили,
рисивать никто ничего не будет,

>если VCL-контролами - выбрось эту мысль из головы, эти контролы >обновляются в осн.трэде процесса, который в этот момент занят >загрузкой формы

а жаль


 
Maxim_S~~   (2004-12-09 12:54) [11]

ах да, у меня ещё ibExpress компонентов штук тридцать....

что ж делать-то?
на медленных машинах прога грузится минуту.


 
Erik1 ©   (2004-12-09 12:54) [12]

Все очень запущено, любой компонент взаимодействует с формой как с контейнером. При создании и удалении он посылает ей Notify. Ты можеш на форме поймать передачу этого сообщения, сделать свое чарное дело и inherited. Но лучше оптимизирой фору, выброси лишние компоненты, сделай один конект к базе и пр.. Для определение тормознутых компонентов подходит метод деления пополам, стираеш половину компонентов запускаеш программу или медленно по прежнему то возвращаеш на место и стираеш другую половину. После дробиш ее на более мелкие части.


 
TUser ©   (2004-12-09 12:56) [13]


> что ж делать-то?
> на медленных машинах прога грузится минуту.

Поставь splash. Delphi на медленных машинах вообще минуты 3 грузится. + Стоит подумать об использовании dll/bpl


 
Александр Иванов ©   (2004-12-09 12:57) [14]

Если много форм, то простой вариант, "привязать" прогресс к созданию форм и на заставке отображать их из кода проекта.


 
Maxim_S~~   (2004-12-09 13:11) [15]

Erik1 ©   (09.12.04 12:54) [12]

где ты вычитал эту инфу?
я ничего этого не знаю, я вообще как слепой котёнок,
выращенный на книгах вроде Архангельского,
где ничего глубокого нет

TUser ©   (09.12.04 12:56) [13]
bpl ускорит загрузку?
да, но тогда программа будет весить позорно мало,
она и так маленькая.

Александр Иванов ©   (09.12.04 12:57) [14]
форм несколько, но перегружена одна,
как я уже говорил полофина тормозов до создания главной формы,
вторая половина в процессе


 
Erik1 ©   (2004-12-09 13:26) [16]

Вот тебе вырезка из кода:
procedure TAttribHolder.Notification(AComponent: TComponent;
 Operation: TOperation);
var
 I: Integer;
 Component: TComponent;
begin
 inherited Notification(AComponent, Operation);
 if not (csDestroying in ComponentState) and (Operation = opRemove) and
   (fAttribute <> nil) then
   for I := fAttribute.Count - 1 downto 0 do begin
     Component := TComponent(fAttribute[i].fComps.Ctrl);
     if Component = AComponent then fAttribute.Delete(i);
   end;
end;

procedure TAttribHolder.SetNotification;
var
 I: Integer;
 Component: TComponent;
begin
 for I := fAttribute.Count - 1 downto 0 do begin
   Component := TComponent(fAttribute[i].fComps.Ctrl);
   if Component <> nil then Component.FreeNotification(Self);
 end;
end;


 
Digitman ©   (2004-12-09 13:26) [17]


> ах да, у меня ещё ibExpress компонентов штук тридцать


вот они, вероятно, и "гадят" всю картину в целом

ты поди у каких-то ibExpress-компонентов на этой форме выставил в дизайн-тайме св-во Active = True ?


 
Maxim_S~~   (2004-12-09 14:05) [18]

ты поди у каких-то ibExpress-компонентов на этой форме выставил в дизайн-тайме св-во Active = True ?

нет, я в своём уме.


 
Maxim_S~~   (2004-12-09 14:35) [19]

уважемый Erik!

что за зверь attrib holder?

как можно трогать компоненты, если они ещё не созданы?


 
Maxim_S~~   (2004-12-09 16:41) [20]

что мне делать с тем что дал Erik?

Erik1 ©   (09.12.04 13:26) [16]


 
Maxim_S~~   (2004-12-10 01:12) [21]

народ будьте так любезны, объясните же наконец, что означает
шестнадцатый пост.


 
Maxim_S~~   (2004-12-11 02:35) [22]

up

народ прошу очень....

ничего не выходит, никакая прорисовка.

никто не писал живых сплешей?


 
Германн ©   (2004-12-11 02:54) [23]

А что собственно тебя волнует?
1. Точная индикация процесса.
2. Индикация сего процесса сама по себе.
Еще раз напомню, что для конечного пользователя не столь важно знать точный процент пройденного пути, сколько то, что процесс идет, а не завис.


 
Fedia ©   (2004-12-11 07:48) [24]

>Германн ©   (11.12.04 02:54) [23]
Еще раз напомню, что для конечного пользователя не столь важно знать точный процент пройденного пути, сколько то, что процесс идет, а не завис.

Почти всегда так. Информация о том, что "процесс идет, а не завис" важен для сохранения психического здоровья пользователей, но "точный процент пройденного пути" (или хотя бы приблизительный) их радовал бы больше.

Maxim_S~~   (11.12.04 02:35) [22]
Основная часть программ, к которым я имею отношение, так же грузятся довольно медленно (в среднем 5-20 секунд), поскольку при загрузке подкачивают справочную информацию из базы данных.
Для информирования пользователей, о том, что процесс загрузки идет (программа не зависла) я реализую процесс загрузки программы следующим образом:
1. Вывожу на экран заставку программы, на которой, для информирования пользователей о процессе загрузки, мигают компоненты Image и отображается компонент JvGifAnimator;
2. Практически всю остальную часть загрузки осуществляю в потоке;
3. Главную форму вывожу на экран по завершению работы потоков.

Таким образом, процесс загрузки отображается, и пользователи не заваливают вопросами типа: а не зависла ли у меня программа?


 
Arm79   (2004-12-11 17:46) [25]

program RTS_Gateway;

uses
 Forms,
 ... ;

{$R *.RES}

begin
 with TfrmZastavka.Create(Application) do
 begin
   Show;
   Update;

 Application.Initialize;
 Application.CreateForm(TfrmMain, frmMain);

   Hide;
   Free;
 end;

 Application.Run;
end.

На форму заставки кинуть какую нибудь красивую картинку и написать на ней: "НИЧЕГО НЕ ТРОГАТЬ, А ТО БУДУ КУСАТЬСЯ". Не пробовал, но если туда кинуть таймер, в обработчик которого прописать Self.Update, то по идее форма будет прорисовываться нормально и картинка всегда будет на виду. Или какую нибудь GIF кинуть на форму.


 
Maxim_S~~   (2004-12-13 01:51) [26]

Arm79   (11.12.04 17:46) [25]

спасибо, но именно это у меня давно сделано,
и никакие таймеры и updat"ы мне рисовать не помогают


 
Maxim_S~~   (2004-12-13 01:53) [27]

1. Точная индикация процесса.
2. Индикация сего процесса сама по себе.

конечно проценты - в данном случае  - верх мечтаний,
но у меня и проситой индикации о том что программа жива - нет


 
Maxim_S~~   (2004-12-13 01:54) [28]

2. Практически всю остальную часть загрузки осуществляю в потоке;

как  этого достичь?


 
Fedia ©   (2004-12-13 04:49) [29]

Я перечитал предыдущие сообщения и понял (хотя раньше надо было это сделать), что тебе мой способ едва ли подойдет. Ведь основная часть времени при загрузке у меня идет на запросы в БД и некоторые вычисления, которые выполняются в обработчике OnCreate. Выполнение таких действий в потоке организовать легко  (ты и сам, наверное, знаешь как).
Выполнение создания форм проекта и работу с визуальными компонентами в дополнительном потоке приходится организовывать с использованием синхронизации, что не дает желаемого результата перерисовки формы заставки по мере загрузки программы.
Таким образом, если у тебя при создании формы, выполняется код, не имеющий отношения к изменению свойств визуальных компонентов, то его можно выполнить в дополнительном потоке без синхронизации. В остальной части кода можно вставить строчки Application.ProcessMessages, которые позволят перерисовать форму заставки.


 
Maxim_S~~   (2004-12-13 21:27) [30]

В остальной части кода можно вставить строчки Application.ProcessMessages, которые позволят перерисовать форму заставки.

т.е. влезть в vcl? А это не нарушит его работу?


 
Германн ©   (2004-12-14 03:44) [31]

2 Fedia ©   (13.12.04 04:49) [29]
А какой смысл имеет Application.ProcessMessages в событии OnCreate формы, которая создается до Application.Run?


 
Fedia ©   (2004-12-14 03:50) [32]

Германн ©   (14.12.04 03:44) [31]
>А какой смысл имеет Application.ProcessMessages в событии >OnCreate формы, которая создается до Application.Run?
По моему, главное, использовать Application.ProcessMessages после
Application.Initialize;

Maxim_S~~   (13.12.04 21:27) [30]  
>т.е. влезть в vcl?
Этого я не советовал.


 
Maxim_S~~   (2004-12-15 02:20) [33]

не верю своим глазам, моя тема опять провалилась...
никого не волнует эта проблема?
или господин Erik всё уже сказал по теме так что она исчерпана.
но я ничего не понял из того что он сказал.

где же наши светила, вроде Юрия Зотова,
почему они молчат...


 
Германн ©   (2004-12-15 02:38) [34]

2 Maxim_S~~   (15.12.04 02:20) [33]
> где же наши светила, вроде Юрия Зотова,
>почему они молчат...

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


 
KSergey ©   (2004-12-15 08:43) [35]

> [33] Maxim_S~~   (15.12.04 02:20)
> никого не волнует эта проблема?

Безусловно. А почему она должна кого-то волновать? Или вы кому-то заплатили деньги? Или вам кто-то чем-то обязан?

> или господин Erik всё уже сказал по теме так что она исчерпана.
> но я ничего не понял из того что он сказал.

Надо так понимать, что это проблема господина Erik"а?

Вы поймите: что там творится в вашем приложении и о чем оно задумывается - знает только 1 человек: вы. А значит и помочь более никто не в силах по определению.
Никто, однако, на сей вопрос толкового ответа получить не смог. Посему по сути добавить нечего, осталось лишь одно - флудить...


 
Den303 ©   (2004-12-15 11:03) [36]

Скажите, Вам обязательно делать Splash Screen в одном файле с программой? Может, имеет смысл написать маленькую программку с заставкой, прогресс отсылать из основной программы сообщениями типа
SendMessage(FindWindow("TForm","Ваша программа"),WM_Сообщение,0,1);
,а принимать
procedure TForm.WMСообщение(var a:TWMСообщение);
begin
 ProgressBar.Position:=ProgressBar.Position+Step;
 Application.ProcessMessages;
end;

???
Получается очень замечательно :o)


 
TUser ©   (2004-12-15 13:39) [37]


> bpl ускорит загрузку?
> да, но тогда программа будет весить позорно мало,
> она и так маленькая.

Ну и проблемы у тебя ...


 
Maxim_S~~   (2004-12-15 14:34) [38]

KSergey ©   (15.12.04 08:43) [35]

Повторю вопрос.
как отловить процесс создания компонентов главный формы,
и заставить в процессе программу рисоваться.
Можно ли это сделать, не портя vcl?

Этот вопрос должен волновать не только меня а многих,
у кого на главной форме больше ста компонентов.
Хорошо, не отвечайте на вопрос, скажите где копать,
хотя бы.
Если бы этот вопрос был интересен только мне, я не делал бы такое количество up"ов, а скромно бы молчал.
У меня машина 1,3 GHz  и я ощущаю неприятную задержку,
а что видят юзеры с дохлыми ноутами?
Они не понимают висит программа или дышит,
а этот сплеш их только раздражает тем что торчит минуту поверх всех окон и мешает работать.

TUser ©   (15.12.04 13:39) [37]

проблемы не у меня а у юзера, который считает что чем программа больше весит, тем больше в ней мозгов.


 
TUser ©   (2004-12-15 14:38) [39]


> TUser ©   (15.12.04 13:39) [37]
>
> проблемы не у меня а у юзера, который считает что чем программа
> больше весит, тем больше в ней мозгов.

Тут ЮЗ предлагал за пять минут сбахать проект на 700Мб. звук-видео всунь туда для таких юзеров.


 
KSergey ©   (2004-12-15 15:22) [40]

> [38] Maxim_S~~   (15.12.04 14:34)
> Этот вопрос должен волновать не только меня а многих,
> у кого на главной форме больше ста компонентов.

Меня он не волнует. ;)
Вобще по сути могу сказать одно: даже 100 компонент на одной форме (к стати, зафиг их там столько??) не могут так долго создаваться! ВОт именно создаваться - НЕ МОГУТ!

Специально посмотрел: проект, главная форма - 50 компонент, на диалог с пользователем выходит можно сказать мнгновенно (P-3, 700).

Вот отсюда и повторю вопрос: опишите, что же происходит в вашем приложении при старте-то?? Висит - ну явно не на создании компонент. Висит в другом где-то (какая-то инициализация, чтение БД, файлов и т.д. - да сколько же можно гадать-то, блин?!!)
Так вот в этом "другом" и стоит сделать индикацию или, того лучше - вынести в поток. Хотя тут тоже есть сложность: если таки для старта приложения все это необходимо - то не все ли равно... Ну разве что "отрисовываться" будет "красиво".

А потому, опять же вопрос к вам (уже был!): что происходит при старте вашей программы?

Такое складывается впечатление, что вы и сами толком этого сказать не можете или не хотите.
А потому не понятно зачем отлавливать именно создание компонент на форме.

> а этот сплеш их только раздражает тем что торчит минуту
> поверх всех окон и мешает работать.

А зафиг вы его забацали поверх всех окон-то??



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.044 c
3-1101812052
Eugene1501
2004-11-30 13:54
2004.12.26
Ошибка при попытке открыть dbf


8-1096004030
Submarine
2004-09-24 09:33
2004.12.26
Проблема с видеозахватом...


14-1102081238
Alhimik
2004-12-03 16:40
2004.12.26
Телефон представительского класса от 15000


4-1099156393
TankMan
2004-10-30 21:13
2004.12.26
Как получить права администратора?


9-1087845784
Darthman
2004-06-21 23:23
2004.12.26
А не устраивать ли нам небольшие конкурсы по кодингу?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский