Здравствуйте, 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 можно выбрать из очереди только асинхронное собщение.
Ну вроде все...