проблемы с PostMessage()
От: Nesta Украина  
Дата: 27.10.09 15:29
Оценка:
Всем добрый день, у меня проблема с ф-цией PostMessage().

Ф-ция вызывается в одном потоке, обработчик ее находится в другом потоке (главном потоке приложения).
По нажатию кнопки запускается поток, который выполняет сохранение файла (сохранение длится около 20 секунд, поэтому было принято решение вынести его логику в отдельный поток, чтоб не блокировать пользовательский интерфейс). Этот поток шлет сообщение главному потоку приложения при помощи PostMessage() для выполнения специфических операций. И все вроде бы ничего, но в какой-то момент сообщение не доходит до функции-обработчика и сохранение файла завершается неудачно. Самое интересное, что когда после этого происходит нажатие на эту же кнопку PostMessage() выполняется успешно и обработчик благополучно выполняется.

Кто-нибудь знает какие-нибудь особенности работы PostMessage() и причины почему сообщения иногда доходят, а иногда — нет.

Еще один момент. Проблема актуальна когда пользователь нажимает на кнопку с очень маленьким интервалом (4 — 5 нажатий в секунду). Такова специфика этого теста. Если пользователь нажимает кнопку с периодичностью 1 раз в 2-3 секунды — все работает нормально.

Заранее благодарен
Re: проблемы с PostMessage()
От: ononim  
Дата: 28.10.09 00:16
Оценка:
если обработчик мессаги представляет собой нечто рядом с DispatchMessage, то вероятно имеет место классическая проблема:
http://blogs.msdn.com/oldnewthing/archive/2009/09/30/9901065.aspx
Как много веселых ребят, и все делают велосипед...
Re[2]: проблемы с PostMessage()
От: trophim Россия  
Дата: 30.10.09 19:36
Оценка:
Блог говорит про PostThreadMessage, а не про PostMessage. Там по ссылке как раз таки совет как бороться с пропадающими сообщениями:

If you need to communicate reliably with a thread that also displays UI, then create a hidden window and send or post messages to that window.)

А автор окнам сообщения шлет (судя по PostMessage).
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Let it be! — Давайте есть пчелу!
Re[3]: проблемы с PostMessage()
От: ononim  
Дата: 30.10.09 20:05
Оценка:
T>Блог говорит про PostThreadMessage, а не про PostMessage. Там по ссылке как раз таки совет как бороться с пропадающими сообщениями:
T>

T>If you need to communicate reliably with a thread that also displays UI, then create a hidden window and send or post messages to that window.)

T>А автор окнам сообщения шлет (судя по PostMessage).
Если немного подумать и понятьчто там написано, то станет ясно что неважно чем слать, а важно как обрабатывать.
Как много веселых ребят, и все делают велосипед...
Re[4]: проблемы с PostMessage()
От: trophim Россия  
Дата: 30.10.09 20:22
Оценка:
Что-то не понял. И как нужно обрабатывать? З.Ы. Да, я в танке...
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Let it be! — Давайте есть пчелу!
Re[5]: проблемы с PostMessage()
От: ononim  
Дата: 30.10.09 20:58
Оценка:
Здравствуйте, trophim, Вы писали:

T>Что-то не понял. И как нужно обрабатывать? З.Ы. Да, я в танке...


НЕ так:
MSG m;
while (::GetMessage(&m, 0, 0, 0))
{
if (m.message==MY_COOL_MESSAGE) DoCoolThing();
...
}
Как много веселых ребят, и все делают велосипед...
Re[6]: проблемы с PostMessage()
От: trophim Россия  
Дата: 31.10.09 00:13
Оценка:
да что ж прям клещами выуживать приходится... а как надо?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Let it be! — Давайте есть пчелу!
Re[7]: MFC
От: Digit_ALL  
Дата: 31.10.09 00:53
Оценка:
Я тоже в танке чуть более чем полностью.
Использовал всю дорогу (благо что короткую) такую конструкцию:
const UINT RWM_CLIENT_EVENT = ::RegisterWindowMessage(
    _T( "RWM_CLIENT_EVENT_B6AE340E-9B28-4B38-9AC5-2664A0238E93" ) );


плюс эту-же RWM_CLIENT_EVENT переменную объявлял в нужных местах в других файлах...
другие потоки уведомляли приблизительно так:

::PostMessage(m_hWnd, RWM_CLIENT_EVENT, (THREAD_EVENT)EVENT_NUMBER, 3);


ну и основной поток потом отлавливал это сообщение приблизительно таким образом

ON_REGISTERED_MESSAGE(RWM_CLIENT_EVENT, &CControllerDlg::OnRegMessage)


ну и сам обработчик:

LRESULT CControllerDlg::OnRegMessage(WPARAM wParam, LPARAM lParam)
{
        // тута делаем чего хотели с интерфейсом...
    return 0;
}


P.S. Более точно покачто не могу сказать, ибо выходные, а все проекты остались на работе.
Re[8]: MFC
От: ononim  
Дата: 31.10.09 01:26
Оценка:
D_A>P.S. Более точно покачто не могу сказать, ибо выходные, а все проекты остались на работе.
так вполне нормально
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.