Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.16;
Скачать: CL | DM;

Вниз

Нужна помощь по работе с Thread   Найти похожие ветки 

 
sniknik ©   (2002-10-15 12:34) [0]

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

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


 
Digitman ©   (2002-10-15 12:49) [1]

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


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

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

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) [3]

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

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

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


 
sniknik ©   (2002-10-15 13:02) [4]

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


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

DispatchMessage(Msg).

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

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


 
sniknik ©   (2002-10-15 13:12) [6]

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


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

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

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


 
sniknik ©   (2002-10-15 13:22) [8]

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



Страницы: 1 вся ветка

Текущий архив: 2002.12.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
6-51849
VitaWED
2002-10-17 22:08
2002.12.16
Соединение по модему.


3-51583
ProgerSM
2002-11-27 13:39
2002.12.16
Вывод данных из нескольких таблиц


3-51605
Alex7
2002-11-27 20:14
2002.12.16
Проблема с


1-51759
greenrul
2002-12-03 19:13
2002.12.16
Стили controls ов -


4-51999
CASU
2002-10-30 17:12
2002.12.16
Приложение - эгоист