Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
ВнизКак мне создать форму во вторичном потоке ? Найти похожие ветки
← →
UnDISCOvery (2002-09-26 16:55) [0]Драсть !
Создаю вторичный поток, хочу туда запихнуть форму которая занимается вводом\выводом данных, как мне это сделать ?
Нужно именно чтобы она существовала не в основном потоке и не "тормозила" его.
Что нужно указывать для Owner, Parent и т.д. ?
← →
reonid (2002-09-26 17:00) [1]Прежде всего, для этого тебе в потоке придётся сделать цикл обработки сообщений. И вообще, это не рекомендуется.
Обычно всё же делают форму в основном потоке, а во вторичном идёт медленный процесс, который иногда (довольно редко) с помощью Sinchronize уведомляет форму о том, что ей нужно отобразить произошедшие изменения.
← →
andrey_pst (2002-09-26 17:02) [2]Замыль мне письмо - пришлю ответ с примером.
← →
MBo (2002-09-26 17:06) [3]>UnDISCOvery
А почему именно форму?
пусть бесформенный поток и занимается I/O
← →
UnDISCOvery (2002-09-26 17:55) [4]по порядку ... :)
2 reonid: с потоком уже все сделал. суть формы в потоке - получать сообщения от других форм интерфейса и менять поток данных, она суть - невидимая, в принципе это даже не TForm, а TWinControl :). Главное чтобы был хэндл.
2 andrey_pst: лови мыло ...
2 MBo:
нужна форма с хэндлом. я в принципе хотел сделать через посылку сообщений напрямую потоку, но пока так не получается ...
← →
NailS (2002-09-26 17:58) [5]
> UnDISCOvery ©
А что разве прямо в поток нельзя посылать сообщения?
PostThreadMessage чем не подходит?
← →
MBo (2002-09-26 18:01) [6]>посылку сообщений напрямую потоку
Кроме совета Nails, можно еще AllocateHWND
← →
UnDISCOvery (2002-09-26 18:15) [7]ну не подходит, т.к. форм может быть много ... т.е. я не делаю ситуацию одна форма - один поток ... я просто хочу убрать "тяжелые" формы из основного потока, чтобы разгрузить интерфейс. И уж насчет PostThreadMessage я уж наверняка подумал.
Не понимаю, по моему вопрос я поставил довольно конкретный. :-/
спасибо за советы конечно, но хотелось что-то конструктивное услышать ...
← →
reonid (2002-09-26 18:24) [8]
Ну так создай форму. Какие у тебя проблемы?
TTestThread = class(TThread)
FForm: TForm;
procedure Execute; override;
end;
procedure TTestThread.Execute;
var Msg: TMsg;
begin
FForm := TTestForm.Create(nil);
FForm.Show;
try
repeat
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
if Msg.Message <> WM_QUIT then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end
else
Terminate;
end;
until Terminated;
finally
FForm.Free;
end;
end;
- всё работает
← →
UnDISCOvery (2002-09-26 18:37) [9]спасибо
← →
troits (2002-09-27 12:52) [10]>reonid
Методы почти всех объектов VCL, уж TForm - то точно, должны выполняться внутри "main VCL thread" см. Help.
← →
Юрий Зотов (2002-09-27 14:16) [11]> troits © (27.09.02 12:52)
> Методы почти всех объектов VCL, уж TForm - то точно, должны
> выполняться внутри "main VCL thread"
Да, при стандартном подходе. Но он не единственный.
> см. Help.
Help надо тоже смотреть с головой. Он не запрещает использовать нестандартные для Delphi (но стандартные для Windows) решения. Надо всего лишь четко понимать, что, как, почему и зачем. И reonid это блестяще продемонстрировал. Глядя именно в Help - но еще глядя в API и исходники TApplication.
← →
troits (2002-09-27 15:06) [12]>Юрий Зотов
Извините, но я не понял, почему решение reonid сделает "поточно-безопасным" использование _любой_ формы.
UnDISCOvery © (26.09.02 18:15)
>я просто хочу убрать "тяжелые" формы из основного потока, чтобы
>разгрузить интерфейс.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c