Главная страница
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.49 MB
Время: 0.017 c
3-26930
kinder
2002-08-20 15:51
2002.09.09
Ну обратите же внимание


3-26917
SerVS
2002-08-11 00:31
2002.09.09
ConnectionString


1-27032
oomneeq
2002-08-26 23:21
2002.09.09
Format function & VarArray


4-27289
voronkov
2002-07-08 12:21
2002.09.09
Подкиньте пожалуйста пример SaveAs для Excel из Delphi


3-26884
BJValentine
2002-08-19 16:05
2002.09.09
Параметр в запросе