![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как показать форму в отдельном потоке [D5]
id_privin © (2002-08-29 17:07:00)Мастера, помогите примером.
По всякому пробовал и даже книжку читал но не получается.
Надо на время определенных действий в основном потоке показать формочку, а потом убрать ее.
id_privin (2002-08-29 19:26:00) [1]Понял я, пришлось переделать на половину. Дело в том что в основном потоке как раз шло создание интерфейса, загрузка настроек из базы, настройка контактов с офисом и прочая туфта. По очевидным причинам в отдельный поток это не выноситься. Причем занимает этот странный процесс секунд десять.
Skier (2002-08-29 19:03:00) [2]>id_privin
Главное что тебе следует запомнить : все обращение к полям,свойствам и методам объектов VCL должны производиться
в контексте основного потока приложения, тобиш тебе нужен
TThread.Synchronize() (см. Digitman © (29.08.02 18:30))
Digitman (2002-08-29 19:02:00) [3]Нельзя.
Переделывать-таки придется.
Считать "долго и нудно" - обязанности доп.код.потока.
Задача же осн.код.потока (в подавляющем большинстве нормальных случаев) - графический интерфейс пользователя
id_privin (2002-08-29 18:41:00) [4]Так мне и надо рисовать в дополнительном потоке, разве это нельзя. В основном у меня ничего рисоваться не будет, он своими делами занят. Очень не хочеться сильно переделывать прогу за ради желания занять юзера делом пока прога считает.
Digitman (2002-08-29 18:30:00) [5]Как минимум отрисовка формы должна происходить только в осн.потоке процесса. Ты же пытаешься "нарисовать" ее в дополнительном потоке и, разумеется, получаешь исключение. К тому же необрабатываемое никак.
Еще раз - почитай о методе TThread.Synchronize() и воспользуйся им для данной цели. Хоть она и бестолковая, цель эта...
id_privin (2002-08-29 17:55:00) [6]Я конечно чего-то не понимаю, но что такое поток вроде знаю.
Делаю так
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)
А потом вообще все рушиться с непонятными ошибками
NailS (2002-08-29 17:53:00) [7]Попробуй не форму в отдельный поток запихнуть, а вынеси в отдельный поток "то что надо", т.е. то из-за чего все остальное тормозит. Проще получится и правильней.
Digitman (2002-08-29 17:39:00) [8]>id_privin
У тебя каша в голове. Разберись в понятиях "процесс" и "кодовые потоки процесса". Оно легче будет дальше.
id_privin (2002-08-29 17:35:00) [9]Ну можно пример, пожалуйста.
Digitman (2002-08-29 17:34:00) [10]посылай некоему окну осн.потока процесса приложения некое сообщение, в обработчике которого выполняй примерные рекомендации от <Hooch>
или воспользуйся тем же самым, реализованным уже в методе TThread.Synchronize()
id_privin (2002-08-29 17:32:00) [11]Надо обязательно в отдельном потоке, тк надо чтобы форма работала, независимо от основного процесса. А так она "висит" пока основной процесс не доделает все что надо
Hooch (2002-08-29 17:08:00) [12]можно так
f := TForm.Create
f.show
f.update
// что то делаем
f.free