Форум: "Основная";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
Внизкак показать форму в отдельном потоке Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c