Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
ВнизУскорение запуска программы? Найти похожие ветки
← →
Артем К. (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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c