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

Вниз

как показать форму в отдельном потоке   Найти похожие ветки 

 
id_privin ©   (2002-08-29 17:07) [0]

Мастера, помогите примером.
По всякому пробовал и даже книжку читал но не получается.

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


 
Hooch ©   (2002-08-29 17:08) [1]

можно так
f := TForm.Create
f.show
f.update
// что то делаем
f.free


 
id_privin ©   (2002-08-29 17:32) [2]

Надо обязательно в отдельном потоке, тк надо чтобы форма работала, независимо от основного процесса. А так она "висит" пока основной процесс не доделает все что надо


 
Digitman ©   (2002-08-29 17:34) [3]

посылай некоему окну осн.потока процесса приложения некое сообщение, в обработчике которого выполняй примерные рекомендации от <Hooch>

или воспользуйся тем же самым, реализованным уже в методе TThread.Synchronize()


 
id_privin ©   (2002-08-29 17:35) [4]

Ну можно пример, пожалуйста.


 
Digitman ©   (2002-08-29 17:39) [5]

>id_privin

У тебя каша в голове. Разберись в понятиях "процесс" и "кодовые потоки процесса". Оно легче будет дальше.


 
NailS ©   (2002-08-29 17:53) [6]

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


 
id_privin ©   (2002-08-29 17:55) [7]

Я конечно чего-то не понимаю, но что такое поток вроде знаю.

Делаю так

type
THeadBandForm = class(TForm)
GIFImage1: TGIFImage;
Text: TLabel;
end;

Runner = class(TThread)
protected
procedure Execute; override;
end;

var
HB : THeadBandForm;


implementation

{$R *.DFM}

{ Runner }

procedure Runner.Execute;
begin
HB := THeadBandForm.Create(nil); <<<LABEL
HB.Show;
HB.Update;
end;

В основном потоке

runner.Crete(false);
sleep(1000);


на место <<<Label попадаем уже после sleep(1000)

А потом вообще все рушиться с непонятными ошибками


 
Digitman ©   (2002-08-29 18:30) [8]

Как минимум отрисовка формы должна происходить только в осн.потоке процесса. Ты же пытаешься "нарисовать" ее в дополнительном потоке и, разумеется, получаешь исключение. К тому же необрабатываемое никак.

Еще раз - почитай о методе TThread.Synchronize() и воспользуйся им для данной цели. Хоть она и бестолковая, цель эта...


 
id_privin ©   (2002-08-29 18:41) [9]

Так мне и надо рисовать в дополнительном потоке, разве это нельзя. В основном у меня ничего рисоваться не будет, он своими делами занят. Очень не хочеться сильно переделывать прогу за ради желания занять юзера делом пока прога считает.


 
Digitman ©   (2002-08-29 19:02) [10]

Нельзя.
Переделывать-таки придется.
Считать "долго и нудно" - обязанности доп.код.потока.
Задача же осн.код.потока (в подавляющем большинстве нормальных случаев) - графический интерфейс пользователя


 
Skier ©   (2002-08-29 19:03) [11]

>id_privin
Главное что тебе следует запомнить : все обращение к полям,свойствам и методам объектов VCL должны производиться
в контексте основного потока приложения, тобиш тебе нужен
TThread.Synchronize() (см. Digitman © (29.08.02 18:30))



 
id_privin ©   (2002-08-29 19:26) [12]

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



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

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

Наверх




Память: 0.5 MB
Время: 0.01 c
1-27032
oomneeq
2002-08-26 23:21
2002.09.09
Format function & VarArray


1-27047
Seldon
2002-08-27 22:14
2002.09.09
Help!


1-26938
Igel
2002-08-27 11:14
2002.09.09
Подскажите где найти инфу по интерфейсам?


1-26964
DmitryMN
2002-08-29 11:21
2002.09.09
Внутренний сервер COM:


1-27087
Filat
2002-08-28 12:08
2002.09.09
Какой компонент может нарисовать вертикальные линии?