Re[14]: SendMessage vs PostMessage
От: Kirill_Luzanov  
Дата: 12.03.03 17:13
Оценка:
Здравствуйте, algod, Вы писали:

A>Здравствуйте, Kirill_Luzanov, Вы писали:


KL>>Здравствуйте, Kirill_Luzanov, Вы писали:


KL>>Забыл уточнить — SendMessage может вызвать оконную процедуру напрямую ТОЛЬОКО если

KL>>она вызывается в родном для окна потоке. Иначе см. выше.
KL>>И соотв. слегка изм. псевдокод:
KL>>
KL>>LRESULT SendMessage(HWND hWnd, UINT Msg , WPARAM wParam , LPARAM lParam)
KL>>{
KL>>   DWORD dwThreadID = System::GetWindowNativeThreadID(hWnd);
KL>>   System::MessageQueue* pQueue = System::GetThreadMessageQueue(dwThreadID);
KL>>   if(GetCurrentThreadId() == pQueue->GetNativeThredId())
KL>>      вызывается оконная процедура
KL>>   else
KL>>   {
KL>>     MSG msg(Msg, wParam, lParam)
KL>>     return pQueue->AddSync(&msg);
KL>>   }
KL>>}
KL>>далее смотри мой предыдущий пост...
KL>>


A> Ладно... Частично сглючил... Как раз из за того, что ты описал в последнем посте .

A>Ведь все таки PostMessage выгребаеться из очереди . Хотя он для того и создан
Со всеми бывает...

Чтобы до конца расставить все точки над "и" резюмирую:
Если вызывающий SendMessage поток явл. РОДНЫМ для окна — сообщение в очередь сообщений
потока НЕ помещается — а НАПРЯМУЮ передается соотв. оконной процедуре.
Если вызвывающий SendMessage поток НЕ ЯВЛ. РОДНЫМ для окна — SendMessage НЕ ВЫЗЫВАЕТ
напрямую оконную процедуру (- если бы это было так — то оконная процедура вызывалсь бы
в ТЕКУЩЕМ потоке — а не потоке ВЛАДЕЮЩЕМ очередью сообщений) — а помещает его в очередь
и ждет обработки сообщения соотв.ф-циями (GetMessage и т.п.) РОДНОГО для окна потока!!!
В WINDOWS ВСЕ СООБЩЕНИЯ ДЛЯ ПОТОКА ОБРАБАТЫАЮТСЯ ТОЛЬКО В САМОМ ПОТОКЕ!
Обработка очереди сообщений:
Если поток не вызывает GetMessage или PeekMessage — то сообщения из ДРУГИХ
потоков НИКОГДА не будут обработанны!
Синхронные сообщения (из других потоков (см. выше)) имеют наибольший приоритет
и обрабатываются в первую очередь! Они обрабатываются автоматически
(перенаправляются в оконную процедру) внутри
вызова потоком Get(Peek)Message.
Используя Get(Peek)Message можно выбрать из очереди только асинхронное собщение.

Ну вроде все...
Think different
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.