![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ускорение запуска программы? [D7, WinXP]
Артем К. © (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) Попробовать ускорить вычисления