Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ускорение запуска программы? [D7, WinXP]


Страницы:   1 2

Артем К. ©   (2004-09-15 06:17:00) 

Привет Мастера!

Есть Form1. В OnCreate выполняются различные вычисления, которые подтормаживают запуск программы.

Как можно избавиться от этого недостатка?

Заранее спасибо.


Erik1   (2004-09-15 10:51:00) [1]

Помоему у тебя проблема в проектировании, если значения считываются только один раз, то получается чтобы посмотреть следующий результат надо перезапустить программу? Нелогично както. Перпологаю, что у тебя много данных и их обработка ведется последовательно. По мере прохождения вычислений надо показывать их. Возможно Application.ProcesMessage решит твои проблемы, но вынести в отдельный поток более красивое решение. Заодно с событиями(TEvent) разберешся.


icebeerg   (2004-09-15 10:50:00) [2]

> Amoeba ©   (15.09.04 10:44) [19]
Все верно. И ничего плохого в сплэшке нет? ИМХО!!!


Amoeba   (2004-09-15 10:44:00) [3]


> icebeerg ©   (15.09.04 10:39) [18]
> Попробуй создать отдельный поток, в нем вычисления а форма
> пусть обновиться по завершении потока.

Какой в таком случае смысл в доп. потоке? IMHO достаточно на время выполнения OnCreate показывать Splash форму.


icebeerg   (2004-09-15 10:39:00) [4]

Попробуй создать отдельный поток, в нем вычисления а форма пусть обновиться по завершении потока. Ну или подели вычисления пополам между потоком и формой.


Defunct   (2004-09-15 10:19:00) [5]

wl   (15.09.04 10:08) [16]

сработает, очередь ведь инициализирована.


wl   (2004-09-15 10:08:00) [6]

вот и я о том же...PostMessage может и не сработать..


Defunct   (2004-09-15 09:56:00) [7]

wl   (15.09.04 09:44) [14]

При создании главной формы - еще не запущен.

цикл в Application.Run, которая вызывается после создания основной формы.


wl   (2004-09-15 09:44:00) [8]

>Digitman ©   (15.09.04 09:31) [13]

а к моменту, когда выполняется OnCreate, уже запущен цикл обработки сообщений? не помню как там в делфи...


Digitman   (2004-09-15 09:31:00) [9]


> Артем К.   (15.09.04 08:56) [11]


если алгоритм коммуникации с контроллерами синхронный, то в этом случае м.б. и оправдан доп.трэд ... в противном случае (если данные от контроллеров поступают "порциями" асинхронно) можно в OnCreate послать самому себе некое сообщение (PostMessage), в обработчике которого инициировать обмен с контроллерами ... и по приходу очер.порции данных от контроллера обновлять грид


Fedia   (2004-09-15 08:58:00) [10]

Артем К.   (15.09.04 08:43) [8]
А если ты будешь производить вычисления в потоке то получится очень не удобно: главная форма загрузилась, StringGrid пустой, до окончания вычисления не известно сколько времени и сиди жди.
Ведь тебе же важно посмотреть на итоговую информацию, а не на пустой StringGrid? Если так, то, по моему, лучше во время запуска выводить заставку.


Артем К.   (2004-09-15 08:56:00) [11]

не снимаются


Digitman   (2004-09-15 08:55:00) [12]


> Артем К.   (15.09.04 08:43) [8]


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


wl   (2004-09-15 08:49:00) [13]

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

Fedia   (15.09.04 07:52) [3]
Можно также перенести часть вычислений на другое событие, например на OnClick кнопки, расположенной на Form1


Артем К.   (2004-09-15 08:43:00) [14]

Суть такая: есть некоторые контроллеры, с них снимаются показания, вычисляются определенные значения, а далее эти значения отображаются в StringGrid.


Fedia   (2004-09-15 08:42:00) [15]


type
 TSQLThrd = class(TThread)
 protected
   procedure Execute; override;
 end;

var
 TSQLThrdCreate: TSQLThrd;

procedure TSQLThrd.Execute;
var
 i: integer;
begin
 Calculation();//функция твоих вычислений
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Zagruzka;//выполнение быстрых вычислений (для которых поток не нужен)
 TSQLThrdCreate:=TSQLThrd.Create(true);
 TSQLThrdCreate.Resume;
end;


Должно работать. И почитай по потокам доки (очень полезно) :).


Digitman   (2004-09-15 08:39:00) [16]


> Артем К.   (15.09.04 08:25) [4]


а зачем это делать именно в ходе обработки OnCreate() ? Чем это оправдано ?


wl   (2004-09-15 08:37:00) [17]

[F1] TThread


Артем К.   (2004-09-15 08:25:00) [18]

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

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


Fedia   (2004-09-15 07:52:00) [19]

Этот недостаток можно обратить в преимущество, если во время запуска программы у тебя будет отображаться "приятная для глаз" заставка.
Можно также перенести часть вычислений на другое событие, например на OnClick кнопки, расположенной на Form1
Fay ©   (15.09.04 06:59) [1]
:)


Fay   (2004-09-15 07:00:00) [20]

4) Попробовать ускорить вычисления


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо