アプリ版:「スタンプのみでお礼する」機能のリリースについて

別プロセスのリストビューへ定期的にLVM_SETITEMSTATEを送っています

しかし、何百回に1回くらいの割合でSendMessageがエラーになっているときがあります

アプリではエラーが出た場合は最初からやり直すことで対処しています

SendMessageが失敗する原因は何が考えられるのでしょうか?

A 回答 (6件)

リストビューのウィンドウプロシージャーが LVM_SETITEMSTATE に対して、FALSE を戻すことが「できる」は仕様です。

なぜ、"その"ウィンドウプロシージャーが FALSE を戻すのかは、"その"ウィンドウプロシージャーの実装に依存すると思います。

> SCツールはアイドル状態ですので、chie65535さん、の言うキューが…
>
# SendMessage() はキューをバイパスすると思います。
    • good
    • 0
この回答へのお礼

ウィンドウプロシジャーの実装が解らない以上どうしようもないですね
これまで通りの処理方法で行うことにします。

jmhさん、はじめみなさんご解答ありがとうございました。

お礼日時:2009/03/15 22:29

> LVM_SETITEMSTATEですと成功TRUE、失敗FALSEです


>
はい。SendMessage() は、その「失敗 FALSE」を戻しているだけだと思います。失敗したのは、SendMessage() ではなくて、リストビューのウィンドウプロシージャーではないでしょうか?

SendMessage() 呼び出し → リストビューの WindowProc() 呼び出される
                                ↓
SendMessage() が TRUE/FALSE を戻す ← WindowProc() が TRUE/FALSE を戻す

# SendMessage() はキューをバイパスすると思います。

この回答への補足

jmhさん、解りやすご説明ありがとうございます。

それにしてもリストビューのキューをバイパスしてします原因は何が考えられますででしょうか?
SCツールはアイドル状態ですので、chie65535さん、の言うキューがいっぱいと言うことは考えられないのですが・・・

補足日時:2009/03/13 22:08
    • good
    • 0

> SendMessageは失敗してます。


>
貴方は、::SendMessage() の戻り値を評価してますが、
http://msdn.microsoft.com/ja-jp/library/cc411022 …
の戻り値には「メッセージ処理の結果が返ります。この戻り値の意味は、送信されたメッセージにより異なります。」とあります。

参考URL:http://msdn.microsoft.com/en-us/library/ms644927 …

この回答への補足

はい、もちろんチェックしてます
LVM_SETITEMSTATEですと成功TRUE、失敗FALSEです

補足日時:2009/03/12 15:09
    • good
    • 0

::SendMessage() は成功してて、LVM_SETITEMSTATE メッセージを受け取ったウィンドウプロシージャーが false を戻してるのだと思います。


リストビュー hLV のウィンドウプロシージャーはどうなってるんですか?

この回答への補足

質問内容が曖昧で申し訳ございません。

SendMessageは失敗してます。
また別プロセスはSCツールというVNCですのでウィンドウプロシジャの実装は解りません。
私が作成したプログラム内容はchie65535さんへの補足を参照して頂けたらと思います

補足日時:2009/03/11 13:13
    • good
    • 1

エラーってどういう状態ですか?



参考URL:http://msdn.microsoft.com/en-us/library/ms644950 …
    • good
    • 0
この回答へのお礼

質問が曖昧で申し訳ございません。

chie65535さんの解答と合わせて細くさせていただきます。

お礼日時:2009/03/10 16:46

Windowsのメッセージキューは無限ではありません。

キューに入れられるメッセージの個数は有限です。

Windowsでは、プロセスごとに「実行優先度」があり、運が悪ければ「実行優先度が低く、なかなか実行させてもらえない」と言う事が起きます。

この時「なかなか実行の順番が回って来ない」と「メッセージキューにメッセージが溜まる一方で、メッセージが処理されない」と言う事が起きます。

そして、あるタイミングで「メッセージキューが一杯になって、もうメッセージが受け取れない」と言う状態になります。

こういう状態になっているプロセスにメッセージを送ればSendMessageは失敗します。

SendMessageに失敗した場合は「他のプロセスに実行権を渡し、ある程度、他のプロセスに実行してもらい、送り先のプロセスがメッセージを処理してキューに空きが出来る事を期待」してから、もう一度、SendMessageをやり直しましょう。

なお、最初からやり直す必要はありません。単に「他のプロセスに実行権を渡す」と言うのを行ってから、失敗したのだけやり直せばOKです。

てゆ~か「定期的に特定のメッセージを特定のプロセスに送り続ける」と言うのは、場合によっては処理しきれない程の高負荷になりシステムをハングアップされる可能性があるので「やるなとは言わないが、避けた方が良い」です。

少なくとも「メッセージキューの糞詰まり」はさせない方が良いでしょう。

この回答への補足

chie65535さん、ご解答ありがとうございます。

VNCでSCツールというのがあるのですが、頻繁に落ちてしまうので落ちたら再度SCツールを立ち上げることをしています。
SCツールを立ち上げ後、リストビューから接続先を取得して・・・
ということをやっています。
上記の接続先の取得の時に、何百回に1度くらい失敗します
SCツールも待ち状態ですのでメッセージキューも空いていると思うのですが・・・

Sleep(0)でスレッドを切り替えて、再度SendMessageしましたが何度送っても失敗しました

こんな感じで試してみました
while (TRUE) {
if (::SendMessage(hLV, LVM_SETITEMSTATE, nIdx, lpvItm ))
break;
::Sleep(0);
}

すみません、テストしてもなかなか落ちないのでお返事が遅れたことお許しください。

補足日時:2009/03/10 16:48
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A