Текущий архив: 2004.02.17;
Скачать: CL | DM;
Вниз
THread again Найти похожие ветки
← →
Andrey V. © (2004-02-08 10:31) [0]Что хотелось бы :
Есть форма с кнопкой.
По нажатию на кнопку начинает выполняться некая работа, причем форма
изчезает (HIDE) а на ее месте возникает маленькая формочка с каким-н.
анимированным гифом (типа , ждите). Ну и в обратном порядке.
Что получается :
Форма с гифом показывается (RX AnimatedImage) , но анимации нет.
Причем если какой-нибудь Проводник распахнуть на весь экран, а потом
свернуть, то на месте этой формы - белое пятно. И так до тех пор пока не
закончится Работа.
Как я делаю :
На главной форме в онклик кнопки
procedure TMainForm.BitBtn1Click(Sender: TObject);
begin
MyQuery := TThreadQuery.Create(True);
Тут процедура делающая большую работу;
Текст Нити я уже честно , говоря раскурочил пока добивался желаемого,
но суть в том , что форма с анимацией создается и кажется в DoWork.
Кстати пробовал использовать TAnimate. Все вроде нормально - мультик показывает ,
но категорически не дает доступа к форме , в смысле мышью не перетащиш .
Наведте на правильную дорогу
← →
TUser © (2004-02-08 10:56) [1]Application.ProcessMessages
← →
Andrey V. © (2004-02-08 11:16) [2]Навставлял везде - не идет.
← →
Verg © (2004-02-08 11:24) [3]
> Как я делаю :
> На главной форме в онклик кнопки
> procedure TMainForm.BitBtn1Click(Sender: TObject);
> begin
> MyQuery := TThreadQuery.Create(True);
> Тут процедура делающая большую работу;
Непонятно. Где "тут"?
А чем же тогда MyQuery занимается?
← →
Polevi © (2004-02-08 13:45) [4]приведи код поточной ф-ии
← →
Polevi © (2004-02-08 13:45) [5]там у тебя Synchronize(DoWork) присутствует скорее всего
← →
Andrey V. © (2004-02-08 14:41) [6]Вот приблизительно , так . Приблизительно потому что в поисках решения я тут менял все и так и этак. Возможно это самый неправильный вариант .
constructor TThreadQuery.Create(bb:boolean);
begin
inherited Create(bb);
Priority:=tpHigher ;
FreeOnTerminate := True;
WaitForm:=CreateForm(TWaitForm, WaitForm);
Resume;
end;
destructor TThreadQuery.Destroy;
begin
inherited;
end;
procedure TThreadQuery.DoWork;
begin
WaitForm.RxGIFAnimator1.Animate:=True;
application.processmessages;
WaitForm.show;
end;
procedure TThreadQuery.OnTerminate ;
begin
WaitForm.Free;
end;
procedure TThreadQuery.Execute;
begin
synchronize(DoWork);
Suspend;
end;
← →
Polevi © (2004-02-09 09:27) [7]ты понимаешь что делает Synchronize ?
← →
Digitman © (2004-02-09 09:27) [8]
> Тут процедура делающая большую работу;
вот эту самую процедуру и следует вынести в доп.код.поток, т.е. вызывать ее в контексте метода TThreadQuery.Execute
а осн.код.поток, запустив TThreadQuery, стартует анимацию и продолжает ждать событий польз.интерфейса
← →
real_dimedrol (2004-02-09 13:52) [9]Прежде чем задавать вопрос, нужно его четко сформулировать.
Пока народ пытается сказать то, что при работе метода, вызванного через synchronize, все потоки кроме текущего "спят". То бишь не обрабатывают сообщения и вообще ничего не делают.
← →
Тимохов © (2004-02-09 13:58) [10]Полностью согласен с Digitman © (09.02.04 09:27) [8].
У тебя основной поток занят (большой работой). А фоновый, вызывающий application.processmessages, не может дождаться основного, т.к. тот занят (большой работой).
Страницы: 1 вся ветка
Текущий архив: 2004.02.17;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.023 c