![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как мне создать форму во вторичном потоке ? [D5, Win2k]
UnDISCOvery © (2002-09-26 16:55:00)Драсть !
Создаю вторичный поток, хочу туда запихнуть форму которая занимается вводом\выводом данных, как мне это сделать ?
Нужно именно чтобы она существовала не в основном потоке и не "тормозила" его.
Что нужно указывать для Owner, Parent и т.д. ?
troits (2002-09-27 15:06:00) [1]>Юрий Зотов
Извините, но я не понял, почему решение reonid сделает "поточно-безопасным" использование _любой_ формы.
UnDISCOvery © (26.09.02 18:15)
>я просто хочу убрать "тяжелые" формы из основного потока, чтобы
>разгрузить интерфейс.
Юрий Зотов (2002-09-27 14:16:00) [2]> troits © (27.09.02 12:52)
> Методы почти всех объектов VCL, уж TForm - то точно, должны
> выполняться внутри "main VCL thread"
Да, при стандартном подходе. Но он не единственный.
> см. Help.
Help надо тоже смотреть с головой. Он не запрещает использовать нестандартные для Delphi (но стандартные для Windows) решения. Надо всего лишь четко понимать, что, как, почему и зачем. И reonid это блестяще продемонстрировал. Глядя именно в Help - но еще глядя в API и исходники TApplication.
troits (2002-09-27 12:52:00) [3]>reonid
Методы почти всех объектов VCL, уж TForm - то точно, должны выполняться внутри "main VCL thread" см. Help.
UnDISCOvery (2002-09-26 18:37:00) [4]спасибо
reonid (2002-09-26 18:24:00) [5]
Ну так создай форму. Какие у тебя проблемы?
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:15:00) [6]ну не подходит, т.к. форм может быть много ... т.е. я не делаю ситуацию одна форма - один поток ... я просто хочу убрать "тяжелые" формы из основного потока, чтобы разгрузить интерфейс. И уж насчет PostThreadMessage я уж наверняка подумал.
Не понимаю, по моему вопрос я поставил довольно конкретный. :-/
спасибо за советы конечно, но хотелось что-то конструктивное услышать ...
MBo (2002-09-26 18:01:00) [7]>посылку сообщений напрямую потоку
Кроме совета Nails, можно еще AllocateHWND
NailS (2002-09-26 17:58:00) [8]
> UnDISCOvery ©
А что разве прямо в поток нельзя посылать сообщения?
PostThreadMessage чем не подходит?
UnDISCOvery (2002-09-26 17:55:00) [9]по порядку ... :)
2 reonid: с потоком уже все сделал. суть формы в потоке - получать сообщения от других форм интерфейса и менять поток данных, она суть - невидимая, в принципе это даже не TForm, а TWinControl :). Главное чтобы был хэндл.
2 andrey_pst: лови мыло ...
2 MBo:
нужна форма с хэндлом. я в принципе хотел сделать через посылку сообщений напрямую потоку, но пока так не получается ...
MBo (2002-09-26 17:06:00) [10]>UnDISCOvery
А почему именно форму?
пусть бесформенный поток и занимается I/O
andrey_pst (2002-09-26 17:02:00) [11]Замыль мне письмо - пришлю ответ с примером.
reonid (2002-09-26 17:00:00) [12]Прежде всего, для этого тебе в потоке придётся сделать цикл обработки сообщений. И вообще, это не рекомендуется.
Обычно всё же делают форму в основном потоке, а во вторичном идёт медленный процесс, который иногда (довольно редко) с помощью Sinchronize уведомляет форму о том, что ей нужно отобразить произошедшие изменения.