Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужна помощь по работе с Thread [D6, Win2k]


sniknik ©   (2002-10-15 12:34:00) 

Вопрос обший т.к. кода еще нет просто надо реализовать а как не знаю, даже как начать :-)).
Смысл, надо в потоке делать чтото в зависимости от разных условий, событий которые происходят в разных местах программы, и желательно ничего не пропустить. То есть нужна очередь событий.
Теоретически понятно, через посылку сообщений PostThreadMessage и прием через GetMessage. Но проблема в том, что не понимаю механизма как это зделать/происходит.
Например попытался вставит в цикл WaitMessage;
while (not Terminated) do begin
WaitMessage;
end;
это повесило поток, внешний терминэйт его не убивает, почему?
В общем дело ясное что дело темное. :-))
Соизволит ктонибудь прояснить?

и ведь что противно пока не столкнулся вплотную все было ясно и понятно. (примеры в дельфях смотрел посылки сообщений там нет, в системных файлах как то запутано, там вообще без циклов сразу GetMessage и т.д. как будто Thread один раз отрабатывает и тут же завершается, может так и надо? и можно настроить так чтобы Execute срабатывал по событию?)
В общем помогайте а то я еще доооолго разбиратся буду. :о((


sniknik   (2002-10-15 13:22:00) [1]

не WM_COPYDATA для меня пока лишнее, я сам себе в одной программе(а значит и пространстве) слать должен.
PostThreadMessage самое то.
буду пробовать. если ктонибудь сюда еще что интересное по теме положит не обижусь ;о))).


sniknik   (2002-10-15 13:12:00) [2]

Сенькс!!! кое что прояснилось.
а нет документации, справочника? Только не с этого сайта, 2 статьи отсюда уже читал.


Юрий Зотов   (2002-10-15 13:12:00) [3]

> насколько громоздкие структуры можно посылать? конечно лутше
> ссылку и освобождать память после работы

См. справку по PostThreadMessage, TMessage и TMsg - ничего другого ни послать, ни принять все равно не удастся. Но через WParam и LParam можно передавать указатели на любые структуры данных (в пределах одного адресного пространства, разумеется - иначе см. WM_COPYDATA).


Юрий Зотов   (2002-10-15 13:06:00) [4]

DispatchMessage(Msg).

Нужна, когда поток имеет окна. По хэндлу окна из Msg она находит нужную оконную функцию и вызывает ее, передавая параметры сообщения. То есть - рассылает сообщения из общей очереди по нужным окнам-адресатам. Этакий диспетчер сообщений - отсюда и название.

Не путать с дельфишным TObject.Dispatch (cм. справку).


sniknik   (2002-10-15 13:02:00) [5]

Кстати насколько громоздкие структуры можно посылать? конечно лутше ссылку и освобождать память после работы но все же?


Юрий Зотов   (2002-10-15 12:58:00) [6]

> это повесило поток, внешний терминэйт его не убивает, почему?

WaitMessage загоняет поток в спячку до прихода сообщения в его очередь. Вызов Terminate выставляет свойство Terminated. А поток спит и проверки while (not Terminated) не происходит - вот все и стоит.

После вызова Terminate надо разбудить поток, послав ему любое сообщение. Тогда прокрутится виток цикла и поток завершится.

procedure Execute;
var
Msg: TMsg;
begin
while not Terminated and GetMessage(Msg, 0, 0, 0) do
begin
... // работаем с Msg
end
end;


sniknik   (2002-10-15 12:58:00) [7]

такой длинный вопрос и такой короткий ответ! но это действительно мне в голову не приходило. спасибо.

но это еще не все, главное! принцип непонятен.

зачем нужен Dispatch(msg.Message) ? и почему в некоторых местах пишут просто Dispatch(msg) отличие/ошибка?


Digitman   (2002-10-15 12:49:00) [8]

var msg: TMsg;
...
while (not Terminated) and GetMessage(msg,0,0,0) do
Dispatch(msg.Message);


Наверх

Титульная страница Поиск, карта сайта Написать письмо