Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > До диалога не доходит сообщение


Автор: ksili 20.2.2009, 09:50
MFC-приложение с несколькими диалогами. 
Один из них при открытии создает и запускает поток. 
Этот поток при завершении посылает user-defined сообщение, на которое в диалоге есть обработчик.

Сообщение из потока посылается, но вот его обработчик никогда не вызывается. Вроде все делаю по найденным примерам.
Вот кратко код:
Код

UINT FW_UPDATE_CHECKED_MESSAGE = RegisterWindowMessage(L"FW_UPDATE_CHECKED_MESSAGE");

....


BEGIN_MESSAGE_MAP(CUpdateFWDlg, CBaseFWDlg)
......
    ON_MESSAGE(FW_UPDATE_CHECKED_MESSAGE, OnUpdateChecked)
END_MESSAGE_MAP()


......


void CUpdateFWDlg::_Update(void)
{
..............

            // заполняем структуру для передачи параметров в поток
    uParams.hwnd = this->GetSafeHwnd();    // передаем хэндл диалога, будет нужен для посылки сообщения

    updThread = AfxBeginThread(_UpdateProc, &uParams);
}

UINT __cdecl _UpdateProc( LPVOID pParam )
{
........................

            // пробовал и PostMessage и SendMessage - одинаковый результат

    //PostMessage(((_UpdateParams*)pParam)->hwnd,FW_UPDATE_CHECKED_MESSAGE, 0, 0);
    SendMessage(((_UpdateParams*)pParam)->hwnd,FW_UPDATE_CHECKED_MESSAGE, 0, 0);

    return 0;
}


LRESULT CUpdateFWDlg::OnUpdateChecked(WPARAM wParam, LPARAM lParam)
{
    // вот сюда управление и не попадает
...................

            return 0;


 - 
Может быть дело в том, что передается неверный hwnd? Вместо него я попробовал ещё 2 значения, указанных в MSDN - HWND_BROADCAST  и NULL. Результат тот же.

Автор: Andrey44 20.2.2009, 10:28
Посылай через PostMessage smile 

Автор: ksili 20.2.2009, 11:00
Andrey44, пробовал

Автор: Andrey44 20.2.2009, 11:15
Интересно, ну тогда вот это PostThreadMessage

Автор: ksili 20.2.2009, 11:31
Уже разобрался. Оказывается вместо ON_MESSAGE надо использовать ON_REGISTERED_MESSAGE

Хотя в тех примерах, что я нашёл, было ON_MESSAGE

Автор: Earnest 20.2.2009, 12:10
ksili, NULL вместо HWND  точно не поможет, да и BROADCAST тоже.
1) Чему равна константа FW_UPDATE_CHECKED_MESSAGE? В смысле, в допустимом диапазоне?
2) Когда заполняется структура uParams, диалог (окно) уже существует? 
3) Она у тебя, часом, не автоматическая?
4) посмотри hWnd в момент записи в структуру и в момент посылки сообщения и сравни.

И лучше пользоваться PostMessage, если не нужно ждать ответа: SendMessage между потоками может привести к взаимоблокировке.

Добавлено через 59 секунд
Цитата(ksili @  20.2.2009,  12:31 Найти цитируемый пост)
Оказывается вместо ON_MESSAGE надо использовать ON_REGISTERED_MESSAGE

Т.е. случай N 1. У них разные диапазоны и, соответственно, разные обработчики.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)