Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

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

 
Артем К.   (2004-09-15 06:17) [0]

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

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

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

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


 
Fay ©   (2004-09-15 06:59) [1]

1) Убрать вычисления
2) Взять комп побыстрее
3) Обдолбаться планом - всё будет просто летать!!!


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

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


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

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


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

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

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


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

[F1] TThread


 
Digitman ©   (2004-09-15 08:39) [6]


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


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


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


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;


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


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

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


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

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

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


 
Digitman ©   (2004-09-15 08:55) [10]


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


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


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

не снимаются


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

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


 
Digitman ©   (2004-09-15 09:31) [13]


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


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


 
wl   (2004-09-15 09:44) [14]

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

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


 
Defunct ©   (2004-09-15 09:56) [15]

wl   (15.09.04 09:44) [14]

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

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


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

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


 
Defunct ©   (2004-09-15 10:19) [17]

wl   (15.09.04 10:08) [16]

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


 
icebeerg ©   (2004-09-15 10:39) [18]

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


 
Amoeba ©   (2004-09-15 10:44) [19]


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

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


 
icebeerg ©   (2004-09-15 10:50) [20]

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


 
Erik1 ©   (2004-09-15 10:51) [21]

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



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

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.039 c
1-1095231354
Black
2004-09-15 10:55
2004.10.03
Как разбить текст на части?


1-1095343895
M-Alex
2004-09-16 18:11
2004.10.03
Командная строка


1-1095508359
BorH
2004-09-18 15:52
2004.10.03
Как создать невидимую главную форму.


6-1090592600
webpauk
2004-07-23 18:23
2004.10.03
WinApi


1-1095342782
lehich
2004-09-16 17:53
2004.10.03
запуск процедуры