• ベストアンサー

SendMessageが失敗するときがある

別プロセスのリストビューへ定期的にLVM_SETITEMSTATEを送っています しかし、何百回に1回くらいの割合でSendMessageがエラーになっているときがあります アプリではエラーが出た場合は最初からやり直すことで対処しています SendMessageが失敗する原因は何が考えられるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jmh
  • ベストアンサー率23% (71/304)
回答No.6

リストビューのウィンドウプロシージャーが LVM_SETITEMSTATE に対して、FALSE を戻すことが「できる」は仕様です。なぜ、"その"ウィンドウプロシージャーが FALSE を戻すのかは、"その"ウィンドウプロシージャーの実装に依存すると思います。 > SCツールはアイドル状態ですので、chie65535さん、の言うキューが… > # SendMessage() はキューをバイパスすると思います。

ozjp999
質問者

お礼

ウィンドウプロシジャーの実装が解らない以上どうしようもないですね これまで通りの処理方法で行うことにします。 jmhさん、はじめみなさんご解答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • jmh
  • ベストアンサー率23% (71/304)
回答No.5

> LVM_SETITEMSTATEですと成功TRUE、失敗FALSEです > はい。SendMessage() は、その「失敗 FALSE」を戻しているだけだと思います。失敗したのは、SendMessage() ではなくて、リストビューのウィンドウプロシージャーではないでしょうか? SendMessage() 呼び出し → リストビューの WindowProc() 呼び出される                                 ↓ SendMessage() が TRUE/FALSE を戻す ← WindowProc() が TRUE/FALSE を戻す # SendMessage() はキューをバイパスすると思います。

ozjp999
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
  • jmh
  • ベストアンサー率23% (71/304)
回答No.4

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

参考URL:
http://msdn.microsoft.com/en-us/library/ms644927(VS.85).aspx#nonqueued_messages
ozjp999
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
  • jmh
  • ベストアンサー率23% (71/304)
回答No.3

::SendMessage() は成功してて、LVM_SETITEMSTATE メッセージを受け取ったウィンドウプロシージャーが false を戻してるのだと思います。 リストビュー hLV のウィンドウプロシージャーはどうなってるんですか?

ozjp999
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
  • jmh
  • ベストアンサー率23% (71/304)
回答No.2

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

参考URL:
http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx
ozjp999
質問者

お礼

質問が曖昧で申し訳ございません。 chie65535さんの解答と合わせて細くさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率44% (8577/19484)
回答No.1

Windowsのメッセージキューは無限ではありません。キューに入れられるメッセージの個数は有限です。 Windowsでは、プロセスごとに「実行優先度」があり、運が悪ければ「実行優先度が低く、なかなか実行させてもらえない」と言う事が起きます。 この時「なかなか実行の順番が回って来ない」と「メッセージキューにメッセージが溜まる一方で、メッセージが処理されない」と言う事が起きます。 そして、あるタイミングで「メッセージキューが一杯になって、もうメッセージが受け取れない」と言う状態になります。 こういう状態になっているプロセスにメッセージを送ればSendMessageは失敗します。 SendMessageに失敗した場合は「他のプロセスに実行権を渡し、ある程度、他のプロセスに実行してもらい、送り先のプロセスがメッセージを処理してキューに空きが出来る事を期待」してから、もう一度、SendMessageをやり直しましょう。 なお、最初からやり直す必要はありません。単に「他のプロセスに実行権を渡す」と言うのを行ってから、失敗したのだけやり直せばOKです。 てゆ~か「定期的に特定のメッセージを特定のプロセスに送り続ける」と言うのは、場合によっては処理しきれない程の高負荷になりシステムをハングアップされる可能性があるので「やるなとは言わないが、避けた方が良い」です。 少なくとも「メッセージキューの糞詰まり」はさせない方が良いでしょう。

ozjp999
質問者

補足

chie65535さん、ご解答ありがとうございます。 VNCでSCツールというのがあるのですが、頻繁に落ちてしまうので落ちたら再度SCツールを立ち上げることをしています。 SCツールを立ち上げ後、リストビューから接続先を取得して・・・ ということをやっています。 上記の接続先の取得の時に、何百回に1度くらい失敗します SCツールも待ち状態ですのでメッセージキューも空いていると思うのですが・・・ Sleep(0)でスレッドを切り替えて、再度SendMessageしましたが何度送っても失敗しました こんな感じで試してみました while (TRUE) { if (::SendMessage(hLV, LVM_SETITEMSTATE, nIdx, lpvItm )) break; ::Sleep(0); } すみません、テストしてもなかなか落ちないのでお返事が遅れたことお許しください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SendMessageについて

    VERSION:VB6.0 SendMessageを使用しSQLPlusに対して文字列を送りたいのですが巧くいきません。 ↓が自身が作成したSendMessageを使用しているプログラムの一部なのですが、おかしな点や別な方法があればご教授お願いします。 '別アプリにメッセージを送る Declare Function SendMessageStr Lib "user32.dll" _ Alias "SendMessageA" (ByVal hWnd As Long, ByVal MSG As Long, _ ByVal wParam As Long, ByVal lParam As String) As Long Dim pId As Long 'プロセスID pId = Shell("SQLPlusのアドレス" & " /nolog", 1) SendMessageStr pId, WM_SETTEXT, 0, "送信する文字列" というプログラムです。 SQLPlusは起動するのですが文字列がSQLPlus側に送れず困っています。 どうかよろしくお願いします。

  • コードは間違ってないのにビルドが必ず失敗になります。

    ビルド、またはデバックなしで開始を押すと必ずエラーになります。 パソコン自体を再起動して、ビルドすると正常にビルドされます。 正常にビルドされるのはその再起動した後の最初の一回だけで、コードを追加したり変更したりしてもう一度ビルドするとエラーになります。 エラー表示内容は以下です↓ ファイル "~~~~" を "~~~~~" にコピーできません。別のプロセスで使用されているため、プロセスはファイル '~~~~~' にアクセスできません。 これはどういう意味なんでしょうか。 正常にビルドするにはどのように対処すればよろしいのでしょうか。 回答お待ちしております。

  • windows7から10へのアップデート失敗

    エラーコード80070057でupdate失敗とでます、原因と対処法教えてください

  • Secand_Rootフェ--ズで失敗しました。。

    昨日もWindows10に挑戦しましたが2回も同じエラ--で失敗に終わりました。。 エラ-番号:Oxc1900101-Ox40017, Secand-Rootフェ-ズに失敗しました。とWindows7を最初に終了後再起動した 直後に表示されました。 この原因分かる方アドバイスをお願いします。Windows7は問題なく使えてます。。

  • 録画失敗

    6日の午後の4時20分すぎの 感動は歌にのって を録画予約したが、30秒ほど別の内容が出て切れました。録画のリストには、感動は歌にのって と記されていました。国会中継が延長になって時間がずれたから録画失敗したのでしょうか。原因がわかればいいのですが

  • User32.dllの初期化に失敗エラー

    WindowsNTサーバ上で「User32.dllの初期化に失敗しました。プロセスは異常終了します」と言うエラーが発生します。 MicroSoftのサポートページを見るとレジストリを変更する事で回避すると記載されていたのですがRegedit32.exeを起動しようとしても同様のエラーが出て進みません。どう対処すれば良いかご存知の方いらっしゃいましたら是非ご教授願います。

  • インターネットからの読み込みに失敗する。

    64bit Ultimateを利用しております。 昨日、OSを買ってきてインストールしてみたところ、IEなどのインターネットに接続するアプリケーション全てにおいて「アプリケーション起動後、初回に読むアドレスは全てエラーが出る」という症状が出るようになりました。 (これの前は、XP Pro 32bitで何事もありませんでした) 例えば、Pangyaは必ず起動後は「アップデートリストの読み込みに失敗しました」のエラーが出てアップデートのお知らせ画面は「Webページへのナビゲーションは取り消されました」と出るのですが 再パッチボタンを押せば通常通り使用でき、ログインも一度コケさせてから二度目でログインできる。 IEにおいては、そのプロセス最初に読み込むアドレスは必ず「Internet Explorerではこのページは表示できません」のエラーメッセージが出るけれどもアドレスバーをクリックしてEnterを押せば 必ず読み込める(別にIEのプロセスを立ち上げればそちらでも同じことをやらされます)という症状が出ております。 一応下記のアドレスの内容を試してみた後 http://support.microsoft.com/kb/926431/ja NICが二枚認識される環境なので片方潰してみたり、ネットワークの設定が二つになっておりましたので結合してひとつにまとめてみたりしました。 対処法をご存知の方がいらっしゃいましたらお教えください。 こちらの環境は ・ネットワーク マンションタイプVDSL ルータ利用して四台接続(ルータ再起動試行済み) うち一台のみ64bit VISTAでこの症状が出る。 他はLinux二機とXP PRO一機でこの症状は出ない。 ・ネットワークデバイス K9N-PlatinumオンボードのNIC(1側をBIOSで封印中 0を利用中) 他、ネットワークに関わる拡張はありません。 よろしくお願いいたします。

  • ps と grep による監視で失敗する事例について

    始めまして。 miko_zzと申します。 現在運用中のサーバでプロセス監視をCシェルで 下記コマンドの結果により行っております。 このコマンドの結果は通常では正常に監視出来ているのですが、 極まれにプロセスは正常に起動中でもエラーを出力してしまいます。 発生条件が判明できないため発生したら目視で確認することで運用を しているのですが、原因が知りたいのでご助力お願い致します。 ちなみに発生頻度は 年に3回くらいで非定期的です。 ------------------------------------------------------------------ SET PRC_ACCOUNT = プロセスを実行したユーザ名 SET PRC_NAME = 監視するプロセス名 ps axuww | egrep ^$PRC_ACCOUNT | grep $PRC_NAME >& /dev/null if ( ${status} != 0 ) then echo "ERROR:プロセスが見つかりません" ; endif ------------------------------------------------------------------

  • Microsoft Update を何度しても「失敗しました」になってしまいます

    Win2000を使っています。 最近Microsoft Updateをすると何度やっても「失敗しまし た」マークが出てきて Updateできません。 「失敗しました」の赤い×マークのところをクリックする とエラーコード: 0x80246001 というのが出てくるので このエラーコード番号をキーワードに検索かけてみまし たが、「"0x80246001" に一致する結果がありません。」 と返ってきてしまいました。 (じゃあこのエラーコードは何??) 現在エラーの原因がわからないのでどう対処していいのか 困っています。(T^T) マイクロソフト社に問合せをする前に一度こちらでお訊ね してからと思い投稿しました。 アドバイスや対処法ご存知の方よろしくお願いいたします。

  • LVM_HITTEST

    マウス位置に存在するエクスプローラ内のアイテムを取得しようと思っております。 エクスプローラの左側のフォルダ一覧(クラス名:SysTreeView32)と右側のファイルとフォルダ名の一覧(クラス名:SysTreeView32)において、そのSysListView32内のマウス位置に存在するアイテムを取得したいのです。 なぜかというと、オリジナルアプリ内のリストビューにFTPサーバのファイル一覧を出力し、リストビューからエクスプローラへの直接ドラッグにより、サーバからローカル\TempにDLして、ドラッグ先にDLしたファイルを移動したいのです。 現状としてはLVM_HITTESTをエクスプローラ内のSysListView32に送っているのですが、こちらが送ったLVHITTESTINFO構造体のXYと、SpyでみたXYの値が違っているのです。結果としてアイテムインデックスを得ることができませんでした。 参考までに、LVM_GETITEMCOUNTはエクスプローラからも取得できました・・・ どのようにしたら、マウス位置のアイテムを取得することができるのでしょうか? 簡単に処理内容を記します。 ドラッグ時に GetCursorPos:マウス位置を取得 WindowFromPoint:マウス位置のハンドル取得 GetClassName:マウス位置のハンドルよりそのオブジェクトのクラス名を取得 以下は[クラス名=SysListView32]のときのみの処理 ScreenToClient:SysListView32をベースとした座標に変換 SendMessage: TVM_HITTESTと、LVHITTESTINFO構造体を送る 以上です。 本当は・・・ アプリはVBにて製作中なのですが、この手の質問はこちらのCの掲示板の方が回答を望めるかもと思って、こちらに質問させていただきました。Cで答えていただいて結構です。こちらでコンバートしますので。。。 どうぞよろしくお願いいたします。m(__)m

このQ&Aのポイント
  • MacBook Air M1 OS13.4を使用している方が、ポータブルDVDユニットの再生方法について知りたいです。
  • 現在、購入したポータブルDVDユニットのソフトウェアのダウンロードとインストールに関して、Mac向けの説明がなく困っています。
  • 市販のソフトウェアを購入する必要があるのか、ポータブルDVDユニットをMacで利用する方法を教えてください。
回答を見る