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

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

Окно ожидания в отдельном потоке


Gu ©   (2010-11-14 20:24:00) 

Что требуется: есть прога, которая выполняет некие действия, которые могут длиться довольно долго, при этом сильно нагружая проц. Требуется перед началом этих действий создать окно, которое информирует пользователя об ожидании. На окне есть компонент гифаниматор, который отображает анимационный гиф. Если просто сделать окно_ожидания.show перед началом действий (а в конце .hide\close), то при выполнении происходят тормоза анимации.
Вот думаю, что хорошо бы чтобы оно показывалось в отдельном потоке.
Сделал так:

отключил автосоздание формы (form2)

в основной форме
...
Type
TGuThread=class(TThread)
private
 procedure Go;
protected
   procedure Execute; override;
end;
...
Var Gu:TGuThread;
...
procedure TGuThread.Go;
begin
form2:=Tform2.Create(nil);
form2.showmodal;
end;

Procedure TGuThread.Execute;
begin
Synchronize(Go);
end;

Procedure TForm1.ShowWait;
begin
 Gu:=TGuThread.Create(true);
 Gu.FreeOnTerminate:=true;
 Gu.Priority:=tpLower;
 Gu.Resume;
end;

далее отрабатывает процедура с вычислениями

Procedure MyRun;
begin
...
вставляю в начале
ShowWait;
... тут тело процедуры где происходят тормоза..
далее
Gu.terminate;
end;

При старте окно появляется, но тормоза как были так и есть и после процедуры окно не закрывается. По поводу тормозов: тормозит только сама прога, другие приложения в это время нормально работают. В теле процедуры есть циклы, но там везде application.processmessages есть, но дело не в них, а в том, что идет опрос устройст (сетевых), которые отвечают через 3-5 сек.

Собственно вопрос: все ли правильно в реализации?
Нужно:
1. показать окно ожидания
2. выполнить процедуру
3. закрыть окно
при этом анимация на окне ожидания не должна тормозить, а само окно работать в другом процессе, отличном от основного приложения


Вариант   (2010-11-15 06:08:00) [1]


> Gu   (15.11.10 04:14) [4]


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

А попроще - это сделать как надо
> Сергей М. ©   (14.11.10 20:38) [2]


И кода меньше прийдется переписывать


Gu   (2010-11-15 04:14:00) [2]

Удалено модератором
Примечание: Не хами


Amoeba_   (2010-11-14 22:35:00) [3]

Окно отображающее ход выполнения длительной операции:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1169


Сергей М.   (2010-11-14 20:38:00) [4]


> все ли правильно в реализации?


Нет . Все поставлено с ног на голову.
Строго наоборот должно быть: "некие действия, которые могут длиться довольно долго" следует выполнять в доп.потоке, а информационное окно показывать в основном потоке.


Германн   (2010-11-14 20:37:00) [5]


> Procedure TGuThread.Execute;
> begin
> Synchronize(Go);
> end;
>

Слава Архангельскому!


Наверх

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