Тоесть, по стеку креша я вижу что блокирующий MessageBox прокинул сообщения в WindowProc через UserCallWinProcCheckWow, что привело к рекурсии.
Как это вообще понимать? и самое главное как с этим бороться?
Здравствуйте, pva, Вы писали:
pva>Тоесть, по стеку креша я вижу что блокирующий MessageBox прокинул сообщения в WindowProc через UserCallWinProcCheckWow, что привело к рекурсии. pva>Как это вообще понимать? и самое главное как с этим бороться?
Ну, вообще-то в очередь сообщение кладёт PostMessage, а SendMessage напрямую дергает WindowProc, так что, теоретически, такое вполне возможно
Здравствуйте, Marty, Вы писали:
M>Ну, вообще-то в очередь сообщение кладёт PostMessage, а SendMessage напрямую дергает WindowProc, так что, теоретически, такое вполне возможно
Нет, там беда в другом. MessageBox(HWND_DESKTOP, ...) не блокирует ничего и нужен флаг MB_TASKMODAL в нагрузку.
Здравствуйте, pva, Вы писали:
M>>Ну, вообще-то в очередь сообщение кладёт PostMessage, а SendMessage напрямую дергает WindowProc, так что, теоретически, такое вполне возможно pva>Нет, там беда в другом. MessageBox(HWND_DESKTOP, ...) не блокирует ничего и нужен флаг MB_TASKMODAL в нагрузку.
Ну, логично, если бы он десктоп заблокировал, ничего бы не работало
Здравствуйте, reversecode, Вы писали:
R>std::recursive_mutex
Нет, в лучшем случае где-то в рекурсии сработает флаг, который начнет размотку, а в общем случае будет stack overflow с кучей MessageBox на экране.
Здравствуйте, Marty, Вы писали:
M>>>Ну, вообще-то в очередь сообщение кладёт PostMessage, а SendMessage напрямую дергает WindowProc, так что, теоретически, такое вполне возможно pva>>Нет, там беда в другом. MessageBox(HWND_DESKTOP, ...) не блокирует ничего и нужен флаг MB_TASKMODAL в нагрузку.
M>Ну, логично, если бы он десктоп заблокировал, ничего бы не работало
Это не так работает. MB_TASKMODAL указывается тоже с HWND_DESKTOP. Но ведь при этом система не лочится. Рекомендую черпнуть из истоков.
Впрочем, вероятно, систему тоже можно залочить, если использовать MB_SYSMODAL.
pva>Тоесть, по стеку креша я вижу что блокирующий MessageBox прокинул сообщения в WindowProc через UserCallWinProcCheckWow, что привело к рекурсии. pva>Как это вообще понимать? и самое главное как с этим бороться?
Я правильно понимаю, что в обработчике оконного сообщения ты вызываешь messagebox, после чего снова приходит это сообщение?
Такое бывает обычно во всяких WM_PAINT.
Обычно достаточно булевского флага на входе функции.
что?
нет
тебе уже ниже написали что messagebox просто вызывает еще раз обработчик
поставь логирование что бы понять на какой ивент
в общем случае рекурсив мютексы для этого и предназначены
они работают на виндовых критических апи секциях
которые так все любят когда пишут на апи и этих проблем нет
а чистые мютексы это немного другое
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Я правильно понимаю, что в обработчике оконного сообщения ты вызываешь messagebox, после чего снова приходит это сообщение? SVZ>Такое бывает обычно во всяких WM_PAINT. SVZ>Обычно достаточно булевского флага на входе функции.
... SVZ>Это то, что тебе требуется?
Да, как вариант решения — годится. Но в данном случае хватило сделать MB блокирующим через MB_TASKMODAL.