PocketPC c ++ проблема рекурсии обработки сообщений windows

У меня проблема в крупномасштабном приложении, которое, кажется, связано с обменом сообщениями Windows на КПК. У меня есть приложение PocketPC, написанное на C ++. У него только один стандартный цикл сообщений.

while (GetMessage (& msg, NULL, 0, 0)) {{TranslateMessage (& msg); DispatchMessage (& сообщение); }}

У нас также есть стандартные файлы dlgProc. В переключателе dlgProc мы будем вызывать проприетарный сторонний API. Этот API использует соединение сокета для связи с другим процессом. Проблема, которую я вижу, заключается в следующем: всякий раз, когда два одинаковых сообщения приходят быстро (от пользователя, щелкающего по экрану дважды слишком быстро, чего не должно быть), кажется, что создается рекурсия. Windows начинает обработку первого сообщения, переводит api в поточно-безопасное состояние, а затем переходит к обработке следующего (идентичного пользовательского интерфейса) сообщения. Ну, поскольку второе сообщение также вызывает вызов API, вызов завершается неудачно, потому что он заблокирован. Из-за конструкции этой устаревшей системы API будет заблокирован до тех пор, пока рекурсия не вернется (что также запускается пользователем; поэтому он может быть заблокирован на весь рабочий день). Я изо всех сил пытаюсь понять, почему это происходит и что я могу с этим поделать. Это потому, что Windows распознает, что обмен данными через сокеты требует времени, и вытесняет его? Есть ли способ заставить этот вызов API завершиться до прерывания? Есть ли способ замедлить обработку сообщения или повторно поставить сообщение в очередь, чтобы гарантировать, что первое будет выполнено (захват его и выполнение PostMessage обратно самому себе не сработало). Мы не хотим блокировать пользовательский интерфейс до завершения первого вызова.

Любое понимание очень ценится! Спасибо!!


person Community    schedule 27.10.2009    source источник


Ответы (1)


Вы можете синхронизировать доступ к API, например, через мьютекс и удерживать входящие задания в локальном контейнере, пока текущее задание не завершит работу с ним.

person Georg Fritzsche    schedule 28.10.2009
comment
Я попытался обернуть вызов как мьютексом, так и критическим разделом, но ни один из них не увенчался успехом. Как я могу задержать поступающие вакансии? Вы имеете в виду, что пока мьютекс заблокирован, все сообщения помещаются в другую очередь? - person ; 03.11.2009
comment
Да, храните сообщения в очереди или что-то еще, что говорит вам, какие задания вы должны делать. Чтобы упростить задачу, я всегда бросал сообщения в очередь и читал одно, когда последнее закончилось. - person Georg Fritzsche; 04.11.2009