![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужна помощь по работе с 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);