あけましておめでとうございます。
一つ困っています。どなたかご存知の方いらっしゃればご教授いただければ幸いです。
▼-----------------------------------------------------------------
APP内で複数のスレッドを使用し、CPU負荷が非常に高くなったタイミングで
ユーザ定義のWMメッセージを::PostMessage()すると、関数自体は成功するのですが、
メッセージハンドラにメッセージがいくら待っても届きません。
この状態になるとAPPがハングアップしてしまいます。
原因は特定できていないのですが、WMメッセージと複数スレッドorその他タスク処理
によるCPU負荷との関係でメッセージが消されてしまうなどの現象はあるのでしょうか?
また上記のような現象を回避するためのテクニックなどご存知の方いらっしゃれば
ご教授下さい。
▲---------------------------------------------------------------------
メッセージをポストされたスレッドがメッセージループを持っていないのでは。
「メッセージループ」とはどのようなものでしょうか?
MSG msg;
while ( GetMessage( &msg, ... ) ) {
...
}
てな感じのやつです(形態に詳細アリ)。
PeekMessage()とかGetMessage()とかをスレッドの中で呼ばないと
(呼んでおかないと)、そのスレッドにメッセージをポストしても
失敗するみたいです。
ところで他スレッドへのメッセージのポストはPostThreadMesage()では?
PostMessageでWMメッセージが届かなかった経験は私にもあります。
おそらくWindowsまたはスレッドのキューエリアがいっぱいで
捨てられてしまったのだと思っています。
Wordとかで過負荷時に↓キーを5回連打したのに3回しかスクロールしなかったりするのも
同じ現象ではないかと思ってます。
なので、APPがハングアップしない構造にするしかないのではないかと思います。
みなさん、いろいろとご意見ありがとうございます。
みんさんの意見を元にいろいろと調査を続けてみました。
結果的には問題は解決されました。PostMessage()するタイミングとほぼ同時に
別タスクでfor(;;)の無限ループ処理を行う箇所(特定のタイミングのみ)があり、
こいつの無限ループをやめてスレッド化することで解決できました。
forやwhileなどの無限ループである条件でbreakされるように
していたのですが、この条件がクリアされない間は制御がとられっぱなしで
PostMessage()してもハンドラが起動しないorキューにメッセ-ジが蓄積された
ままでSend待ち状態になっているのが原因なのではと考えてるのですが、
どうなんでしょう? 「もしかして○○なんじゃないの?」の的でもよいので
ご意見下されば幸いです。
forループの代わりにWaitForSingleObject()とSetEvent()を使うとか。
みなさんいろいろなご意見ありがとうございました。
原因として「これだ!」という明確なところはまだですが、ご協力のおかげでかなり近いづい
たのではと思っています。勝手ながらとりあえずこの質問は解決済みとさせていただきます。
ありがとうございました。