2017-01-30 2 views
0

Из одного потока я отправляю сообщение в основной поток в процедуре окна. Но это не увенчалось успехом. Когда я отправляю сообщения из той же темы - все в порядкеSendNotifyMessage не отправляет правильные сообщения

include "stdafx.h" 
#include <Windows.h> 
#include <atlbase.h> 


#define MAX_THREADS 1 

HWND m_wnd; 

enum 
{ 
    EVENT_CALL = (WM_APP + 0x30), 
}; 


static LRESULT CALLBACK function_call() 
{ 
    //some code 
    int test = 0; 
    return 0; 
} 

static LRESULT CALLBACK http_message_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
     switch (uMsg) 
     { 
     case EVENT_CALL: 
      function_call(); 
      return 0; 
     } 
    return ::DefWindowProc(hWnd, uMsg, wParam, lParam); 
} 

void CreateNotifyWnd() 
{ 
    WNDCLASSEX w = { 0 }; 
    w.cbSize = sizeof(w); 
    w.hInstance = (HINSTANCE)&__ImageBase; 
    w.lpszClassName = L"uistone_http_event_wnd"; 
    w.lpfnWndProc = http_message_proc; 
    ::RegisterClassEx(&w); 
    int error = GetLastError(); 
    m_wnd = ::CreateWindowEx(0, w.lpszClassName, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, w.hInstance, 0); 
    error = GetLastError(); 
} 


DWORD WINAPI SendThread(void* request_param) 
{ 
    ::SendNotifyMessage(m_wnd, EVENT_CALL, 11, 12); 
    int error = GetLastError(); 
    return 0; 
} 


int main() 
{ 
    CreateNotifyWnd(); 
    HANDLE hThreadArray[MAX_THREADS]; 

    hThreadArray[0] = CreateThread(nullptr, 0, SendThread, nullptr, 0, nullptr); 
    //::SendNotifyMessage(m_wnd, EVENT_CALL, 11, 12); 

    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE); 

    return 0; 
} 

Почему я не могу поймать сообщения из другого потока? Спасибо.

+0

Вам не кажется, есть цикл обработки сообщений ... https://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows – UKMonkey

+0

1) Где ваш цикл обработки сообщений? 2) Как вы убедитесь, что ваш код ловит или не получает сообщение? –

+0

http_message_proc является функцией цикла в программе –

ответ

1

Это документированное поведение. Это соответствующая часть из документации SendNotifyMessage:

Если окно было создано вызывающим потоком, SendNotifyMessage вызывает оконную процедуру для окна и не возвращается, пока оконная процедура не обработает сообщение. Если окно было создано другим потоком, SendNotifyMessage передает сообщение в оконную процедуру и немедленно возвращается; он не ждет завершения оконной процедуры обработки сообщения.

Это, кажется, работает при использовании окна, созданного в том же потоке, потому что при вызове SendNotifyMessage, функция синхронно вызывает в оконной процедуре, связанной с целевым окном, прежде чем вернуться.

Если вызов пересекает потоки, с другой стороны, вам нужно будет запустить цикл сообщений для сообщения «now queued», чтобы получить и передать в процедуру окна 1). Приложение не запускает цикл сообщений, и оно выходит до того, как сообщение достигнет целевого окна.

Чтобы исправить это, вам нужно запустить цикл сообщений. Это может быть или не быть правильным подходом к вашей проблеме. Поскольку мы не знаем, какую проблему вы пытаетесь решить, мы не можем предложить потенциально превосходные подходы и решения.


1) См About Messages and Message Queues: Message Routing.

+0

Я создал цикл сообщений для окна в' CreateNotifyWnd' –

+0

@MartinJuin: Не в коде, который вы опубликовали. Вы зарегистрировали [процедуру окна] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632593.aspx), но нет цикла, который истощает очередь сообщений или отправляет сообщения. – IInspectable

+0

Хорошо, я вижу - это моя ошибка - нет цикла. Но должен ли я писать этот цикл и как? –