Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.47 MB
Время: 0.006 c
3-51652
nick-from
2002-11-28 23:31
2002.12.16
Коды ошибок Interbase


1-51715
Oleg__
2002-12-06 11:16
2002.12.16
TListBox


1-51793
Крокус
2002-12-04 18:43
2002.12.16
удаленный доступ


1-51821
Sergy
2002-12-05 11:27
2002.12.16
Flash файл в заставку


3-51657
tepa
2002-11-28 22:59
2002.12.16
восстановление индексов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский