Форум: "WinAPI";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Внизкак сделать PeekThreadMessage ? Найти похожие ветки
← →
pirat (2003-09-07 00:06) [0]такой функции нет - PeekThreadMessage, а она мне нужна. У меня поток во время работы должен проверить, есть ли сообщения, если есть вытащить его и проверить его тип и изменить поведение.
Что делать ?
← →
nikkie (2003-09-07 00:35) [1]PeekMessage
← →
pirat (2003-09-07 01:44) [2]У моего потока нету окна, и оно ему нафиг не надо. Хотите сказать чтобез невидимого окна я не обойдусь ?
← →
VMcL (2003-09-07 03:30) [3]>pirat © (07.09.03 00:06)
GetMessage ?
← →
Alex Konshin (2003-09-07 05:11) [4]Если нет окна, то нет и сообщений, или я что-то не так понимаю?
← →
Suntechnic (2003-09-07 05:52) [5]>Alex Konshin ©
Если нет окна, то нет и сообщений, или я что-то не так понимаю?
Окна может и не быть и сообщения будут прекрасно отсылаться/приниматься. Очередь сообщения строится для потока, а не для окна.
>pirat © (07.09.03 01:44) [2]
У моего потока нету окна, и оно ему нафиг не надо. Хотите сказать чтобез невидимого окна я не обойдусь ?
Обойдёщься. Второй параметр ф-ций PeekMessage/GetMessage равный 0 спасёт отца русской демократии. Другое дело что с окном всё-таки удобней, но это как кому нравится.
← →
Alex Konshin (2003-09-07 07:59) [6]Для того, чтобы появилась очередь нужно вызвать что-нибудь (хотя бы и тот же PeekMessage) в этой нити хотя бы раз. А иначе отправителю и посылать-то некому будет.
← →
pirat (2003-09-07 10:02) [7]Спасибо !!
← →
Suntechnic (2003-09-07 16:23) [8]>Alex Konshin ©
Для того, чтобы появилась очередь нужно вызвать что-нибудь (хотя бы и тот же PeekMessage) в этой нити хотя бы раз. А иначе отправителю и посылать-то некому будет.
Очередь сообщений создаётся тогда, когда создаётся поток, а не тогда когда мы что-нибудь вызываем или создаём окошки. И у отправителя всегда есть возможность отослать сообщение в поток с помощью ф-ции PostThreadMessage.
← →
nikkie (2003-09-07 17:31) [9]>[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.
← →
nikkie (2003-09-07 17:35) [10]>Другое дело что с окном всё-таки удобней, но это как кому нравится.
Чем же это удобнее? RegisterWindowClass, CreateWindow, цикл выборки сообщений, сама WndProc, в которой наконец-то можно проанализировать и обработать (вызвать обработчик) для полученного message. Чем же это будет удобнее одного цикла выборки, внутри которого стоит вызов обработчика?
← →
Suntechnic (2003-09-08 08:12) [11]>nikkie © [9]
Погорячился я с созданием очереди сообщений, но с другой стороны трудно, наверное, найти поток, который запустился и не произвёл ни одного вызова из user или gdi, впрочем всё может быть.
>nikkie © [10]
Чем же это удобнее?
Да хотя бы тем, что описано в nikkie © [9] + не все сообщения доступны этой очереди (например c broadcast облом будет)+ иконку в трей не повесишь, что очень актуально на данном сайте ;)
← →
nikkie (2003-09-08 10:50) [12]>>Чем же это удобнее?
>Да хотя бы тем, что описано в nikkie © [9]
нужно ли вызывать CreateWindow, если цель добиться создания очереди? тоже самое получится и после GetMessage, например. в [9] вроде я цитировал MSDN на тему того, как нужно дожидаться создания очереди сообщений потоком до того, как посылать ему сообщения. CreateWindow тут никак помочь не может.
>не все сообщения доступны этой очереди (например c broadcast облом будет)
это аргумент, но задача уж больно специфичная
>иконку в трей не повесишь, что очень актуально на данном сайте ;)
это тоже аргумент ;)
← →
Verg (2003-09-08 11:33) [13]var Msg : TMsg;
PeekMessage(Msg, 0,0,0,PM_REMOVE)
← →
pirat (2003-09-08 23:40) [14]>иконку в трей не повесишь, что очень актуально на данном сайте ;)
>это тоже аргумент ;)
но не в моем случае ;)) если мне надо будет вешать иконки, буду делать это из основного потока, в котором у меня интерфейс находится
Спасибо всем еще раз!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.037 c