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

Вниз

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

 
Gu   (2010-11-14 20:24) [0]

Что требуется: есть прога, которая выполняет некие действия, которые могут длиться довольно долго, при этом сильно нагружая проц. Требуется перед началом этих действий создать окно, которое информирует пользователя об ожидании. На окне есть компонент гифаниматор, который отображает анимационный гиф. Если просто сделать окно_ожидания.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-14 20:37) [1]


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

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


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


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


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


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

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


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

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


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


> Gu   (15.11.10 04:14) [4]


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

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


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



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

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

Наверх




Память: 0.48 MB
Время: 0.009 c
2-1289775258
Германн
2010-11-15 01:54
2011.02.06
Реальное значение NULL в СУБД


2-1289810551
Евгений07
2010-11-15 11:42
2011.02.06
наследование


6-1233781685
HITMAN
2009-02-05 00:08
2011.02.06
Удалённый рабочий стол.


3-1251978558
Sergey2
2009-09-03 15:49
2011.02.06
top2 по каждому значению условия


2-1289811718
на4инающий
2010-11-15 12:01
2011.02.06
парсинг имени файла