Форум: "Система";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];
ВнизНужна помощь по работе с 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c