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

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

как сделать PeekThreadMessage ? [D7, WinXP]


pirat ©   (2003-09-07 00:06:00) 

такой функции нет - PeekThreadMessage, а она мне нужна. У меня поток во время работы должен проверить, есть ли сообщения, если есть вытащить его и проверить его тип и изменить поведение.
Что делать ?


pirat   (2003-09-08 23:40:00) [1]

>иконку в трей не повесишь, что очень актуально на данном сайте ;)
>это тоже аргумент ;)
но не в моем случае ;)) если мне надо будет вешать иконки, буду делать это из основного потока, в котором у меня интерфейс находится

Спасибо всем еще раз!


Verg   (2003-09-08 11:33:00) [2]

var Msg : TMsg;

PeekMessage(Msg, 0,0,0,PM_REMOVE)


nikkie   (2003-09-08 10:50:00) [3]

>>Чем же это удобнее?
>Да хотя бы тем, что описано в nikkie © [9]
нужно ли вызывать CreateWindow, если цель добиться создания очереди? тоже самое получится и после GetMessage, например. в [9] вроде я цитировал MSDN на тему того, как нужно дожидаться создания очереди сообщений потоком до того, как посылать ему сообщения. CreateWindow тут никак помочь не может.

>не все сообщения доступны этой очереди (например c broadcast облом будет)
это аргумент, но задача уж больно специфичная

>иконку в трей не повесишь, что очень актуально на данном сайте ;)
это тоже аргумент ;)


Suntechnic   (2003-09-08 08:12:00) [4]

>nikkie © [9]
Погорячился я с созданием очереди сообщений, но с другой стороны трудно, наверное, найти поток, который запустился и не произвёл ни одного вызова из user или gdi, впрочем всё может быть.

>nikkie © [10]
Чем же это удобнее?
Да хотя бы тем, что описано в nikkie © [9] + не все сообщения доступны этой очереди (например c broadcast облом будет)+ иконку в трей не повесишь, что очень актуально на данном сайте ;)


nikkie   (2003-09-07 17:35:00) [5]

>Другое дело что с окном всё-таки удобней, но это как кому нравится.
Чем же это удобнее? RegisterWindowClass, CreateWindow, цикл выборки сообщений, сама WndProc, в которой наконец-то можно проанализировать и обработать (вызвать обработчик) для полученного message. Чем же это будет удобнее одного цикла выборки, внутри которого стоит вызов обработчика?


nikkie   (2003-09-07 17:31:00) [6]

>[4] Alex Konshin
>Если нет окна, то нет и сообщений, или я что-то не так понимаю?

это неверно.

[6] Alex Konshin
Для того, чтобы появилась очередь нужно вызвать что-нибудь (хотя бы и тот же PeekMessage) в этой нити хотя бы раз. А иначе отправителю и посылать-то некому будет.

ну не совсем "что-нибудь", см. ниже.

[8] Suntechnic
Очередь сообщений создаётся тогда, когда создаётся поток, а не тогда когда мы что-нибудь вызываем или создаём окошки. И у отправителя всегда есть возможность отослать сообщение в поток с помощью ф-ции PostThreadMessage.

это неверно.

The system creates a thread-specific message queue only when the thread makes its first call to one of the Win32 User or GDI functions.

Еще из справки по PostThreadMessage:

The thread to which the message is posted must have created a message queue, or else the call to PostThreadMessage fails. Use one of the following methods to handle this situation:

Call PostThreadMessage. If it fails, call the Sleep function and call PostThreadMessage again. Repeat until PostThreadMessage succeeds.
Create an event object, then create the thread. Use the WaitForSingleObject function to wait for the event to be set to the signaled state before calling PostThreadMessage. In the thread to which the message will be posted, call PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE) to force the system to create the message queue. Set the event, to indicate that the thread is ready to receive posted messages.


Suntechnic   (2003-09-07 16:23:00) [7]

>Alex Konshin ©
Для того, чтобы появилась очередь нужно вызвать что-нибудь (хотя бы и тот же PeekMessage) в этой нити хотя бы раз. А иначе отправителю и посылать-то некому будет.

Очередь сообщений создаётся тогда, когда создаётся поток, а не тогда когда мы что-нибудь вызываем или создаём окошки. И у отправителя всегда есть возможность отослать сообщение в поток с помощью ф-ции PostThreadMessage.


pirat   (2003-09-07 10:02:00) [8]

Спасибо !!


Alex Konshin   (2003-09-07 07:59:00) [9]

Для того, чтобы появилась очередь нужно вызвать что-нибудь (хотя бы и тот же PeekMessage) в этой нити хотя бы раз. А иначе отправителю и посылать-то некому будет.


Suntechnic   (2003-09-07 05:52:00) [10]

>Alex Konshin ©
Если нет окна, то нет и сообщений, или я что-то не так понимаю?

Окна может и не быть и сообщения будут прекрасно отсылаться/приниматься. Очередь сообщения строится для потока, а не для окна.

>pirat © (07.09.03 01:44) [2]
У моего потока нету окна, и оно ему нафиг не надо. Хотите сказать чтобез невидимого окна я не обойдусь ?

Обойдёщься. Второй параметр ф-ций PeekMessage/GetMessage равный 0 спасёт отца русской демократии. Другое дело что с окном всё-таки удобней, но это как кому нравится.


Alex Konshin   (2003-09-07 05:11:00) [11]

Если нет окна, то нет и сообщений, или я что-то не так понимаю?


VMcL   (2003-09-07 03:30:00) [12]

>pirat © (07.09.03 00:06)

GetMessage ?


pirat   (2003-09-07 01:44:00) [13]

У моего потока нету окна, и оно ему нафиг не надо. Хотите сказать чтобез невидимого окна я не обойдусь ?


nikkie   (2003-09-07 00:35:00) [14]

PeekMessage


Наверх

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