0

Pocket PC の Windows メッセージングに関連すると思われる大規模なアプリケーションで問題が発生しています。私が持っているのは、c++ で書かれた PocketPC アプリケーションです。標準メッセージ ループは 1 つだけです。

while (GetMessage (&msg, NULL, 0, 0)) { { TranslateMessage (&msg); DispatchMessage (&msg); } }

標準の dlgProc もあります。dlgProc の切り替えでは、独自のサードパーティ API を呼び出します。この API は、ソケット接続を使用して別のプロセスと通信します。私が見ている問題は次のとおりです。同じメッセージが 2 つすばやく届くと (ユーザーが画面を 2 回クリックするのが速すぎて、そうであってはなりません)、再帰が作成されたように見えます。Windows は最初のメッセージの処理を開始し、API をスレッド セーフな状態にしてから、ジャンプして次の (同一の ui) メッセージを処理します。2 番目のメッセージも API 呼び出しを行うため、ロックされているため呼び出しは失敗します。このレガシー システムの設計により、API は再帰が戻るまでロックされます (これもユーザーによってトリガーされるため、営業日全体がロックされる可能性があります)。なぜこれが起こっているのか、そしてそれに対して何ができるのかを正確に理解するのに苦労しています. これは、Windows がソケット通信に時間がかかることを認識し、プリエンプトするためですか? プリエンプションの前にこの API 呼び出しを強制的に完了する方法はありますか? メッセージ処理を遅くしたり、メッセージを再キューイングして最初のメッセージが確実に実行されるようにする方法はありますか (それをキャプチャして PostMessage をそれ自体に戻すことはできませんでした)。最初の呼び出しが完了する間、UI をロックダウンしたくありません。これは、Windows がソケット通信に時間がかかることを認識し、プリエンプトするためですか? プリエンプションの前にこの API 呼び出しを強制的に完了する方法はありますか? メッセージ処理を遅くしたり、メッセージを再キューイングして最初のメッセージが確実に実行されるようにする方法はありますか (それをキャプチャして PostMessage をそれ自体に戻すことはできませんでした)。最初の呼び出しが完了する間、UI をロックダウンしたくありません。これは、Windows がソケット通信に時間がかかることを認識し、プリエンプトするためですか? プリエンプションの前にこの API 呼び出しを強制的に完了する方法はありますか? メッセージ処理を遅くしたり、メッセージを再キューイングして最初のメッセージが確実に実行されるようにする方法はありますか (それをキャプチャして PostMessage をそれ自体に戻すことはできませんでした)。最初の呼び出しが完了する間、UI をロックダウンしたくありません。

どんな洞察も大歓迎です!ありがとう!!

4

1 に答える 1

1

ミューテックスなどを介して API へのアクセスを同期し、現在のジョブが処理を終了するまで受信ジョブをローカル コンテナーに保持することができます。

于 2009-10-28T00:09:18.627 に答える