WMメッセージとCPU負荷の関係? – プログラミング – Home

WMメッセージとCPU負荷の関係?
 
通知
すべてクリア

[解決済] WMメッセージとCPU負荷の関係?


Osa
 Osa
(@Osa)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

あけましておめでとうございます。
一つ困っています。どなたかご存知の方いらっしゃればご教授いただければ幸いです。

▼-----------------------------------------------------------------
 APP内で複数のスレッドを使用し、CPU負荷が非常に高くなったタイミングで
ユーザ定義のWMメッセージを::PostMessage()すると、関数自体は成功するのですが、
メッセージハンドラにメッセージがいくら待っても届きません。
この状態になるとAPPがハングアップしてしまいます。

 原因は特定できていないのですが、WMメッセージと複数スレッドorその他タスク処理
によるCPU負荷との関係でメッセージが消されてしまうなどの現象はあるのでしょうか?
また上記のような現象を回避するためのテクニックなどご存知の方いらっしゃれば
ご教授下さい。

▲---------------------------------------------------------------------


引用未解決
トピックタグ
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

メッセージをポストされたスレッドがメッセージループを持っていないのでは。


返信引用
Osa
 Osa
(@Osa)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

「メッセージループ」とはどのようなものでしょうか?


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

MSG msg;
while ( GetMessage( &msg, ... ) ) {
...
}
てな感じのやつです(形態に詳細アリ)。

PeekMessage()とかGetMessage()とかをスレッドの中で呼ばないと
(呼んでおかないと)、そのスレッドにメッセージをポストしても
失敗するみたいです。

ところで他スレッドへのメッセージのポストはPostThreadMesage()では?


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 25年前
投稿: 149
 

PostMessageでWMメッセージが届かなかった経験は私にもあります。
おそらくWindowsまたはスレッドのキューエリアがいっぱいで
捨てられてしまったのだと思っています。
Wordとかで過負荷時に↓キーを5回連打したのに3回しかスクロールしなかったりするのも
同じ現象ではないかと思ってます。
なので、APPがハングアップしない構造にするしかないのではないかと思います。


返信引用
Osa
 Osa
(@Osa)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

みなさん、いろいろとご意見ありがとうございます。

みんさんの意見を元にいろいろと調査を続けてみました。
結果的には問題は解決されました。PostMessage()するタイミングとほぼ同時に
別タスクでfor(;;)の無限ループ処理を行う箇所(特定のタイミングのみ)があり、
こいつの無限ループをやめてスレッド化することで解決できました。

forやwhileなどの無限ループである条件でbreakされるように
していたのですが、この条件がクリアされない間は制御がとられっぱなしで
PostMessage()してもハンドラが起動しないorキューにメッセ-ジが蓄積された
ままでSend待ち状態になっているのが原因なのではと考えてるのですが、
どうなんでしょう? 「もしかして○○なんじゃないの?」の的でもよいので
ご意見下されば幸いです。

 


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

forループの代わりにWaitForSingleObject()とSetEvent()を使うとか。


返信引用
Osa
 Osa
(@Osa)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

 みなさんいろいろなご意見ありがとうございました。
 原因として「これだ!」という明確なところはまだですが、ご協力のおかげでかなり近いづい
 たのではと思っています。勝手ながらとりあえずこの質問は解決済みとさせていただきます。
 ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました