問題タブ [getmessage]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - C プログラムが GetMessage 内でハングする
私たちのプログラムは、顧客のマシン (ほとんどの場合 Windows 7) でハングします。
プログラムは、別のマシンでサーバーに接続するクライアントです。これは、Win32 プログラミング グラフィカル インターフェイスを備えた C プログラムです。
症状: クライアント アプリケーションをランダムに実行しているときに、突然白っぽくなり、「アプリケーションが応答を停止しました」というダイアログ ボックスが表示され、「アプリケーションを閉じる」、「アプリケーションが応答するのを待つ」などの 2 つのオプションが表示されます。 AppHang-B1.
当社のシステムではこの問題を再現できませんでした。しかし、一度問題を再現してクラッシュダンプを取りました。
コールスタックは次のように述べています。
以下のクラッシュ時のソースコード。GetMessage 行でハングすることに注意してください。
windbg のローカル変数
なぜぶら下がっているのですか?msg->message 0x325 に関する情報を取得できませんでした
前もって感謝します
以下の質問に対する詳細情報と回答
返信ありがとうございますはい、GetMessageループを次のように変更する必要があります
私はそれをやります
@Lundinマルチスレッドアプリケーションではありません。
ハングに関する詳細情報 ... ハングは主に、他のアプリケーションからクライアントに Alt Tab したときに発生します。いつでも発生する可能性がありますが...メッセージ0x325が何であるかについての洞察はありますか?
c - Windows プログラムのメッセージ ループは常に「ループ」していますか?
経験豊富なプログラマーにとって質問が簡単すぎる場合は申し訳ありません。私は Petzold でウィンドウの基本を使い始めたばかりですが、Mathematica といくつかの C および Labview でプログラミングした経験があります。
Whileループとして実装されているように見えるWindowsのメッセージループについて私が理解していないことは、「通常の」Cプログラムでは、条件が真である限りwhileループが実行され、プログラムが次の命令に進むまでプログラムが実行されるようです終了します。プログラムの実行と終了につながる時間内の一連のイベントのように視覚化します。これは、時間とシーケンスが重要ではなく、ユーザーが中断しない限りプログラムが決して終了しない Labview プログラムの同じ哲学ではありません。
Windowsで理解している限り、プログラムを中断しない限り、メッセージループは永遠に続きます。ほとんど無限ループとして動作し、常にアクティブです。GetMessage のブール値の結果によって与えられるメッセージ ループの true/false 条件が変更された場合、一度 false を取得すると、プログラムはそこで終了しないのはなぜですか?
Labview プログラムには、時間や操作シーケンスの強力な概念はありません。While ループの true/false 条件のように、任意の瞬間に条件が変化する可能性があり、ループはコード ブロックの実行を開始するか停止します。プログラムが何らかの形で終わりに近づいていることを意味するものではありません。それはWindowsでもどのように機能しますか?
私が言うのは、次のようなプログラムであるということだけです:
コードのブロックを実行するだけで、そこで終了すると思います。しかし、ウィンドウでは、コードを実行するために条件が真になるのを「待機」し続けます。私はこれを正しく理解していないと信じているため、誰かにこのメカニズムを解決するよう求めています。
java - 私の例外とスローと getMessage のエラーは何ですか?
コードがあり、エラーの場所を知りたいのですが、助けてください: スロー行にエラーが 1 つだけあります
c++ - GetMessage からの Windows メッセージ 9?
編集:ここに貼り付けたコードを削除します。コードのエラーにより、説明されている動作が発生していました ( break
switch ステートメントに a がありません)。
からのメッセージを処理するswitch
ステートメントで、GetMessage
エイリアスが定義されていないいくつかのメッセージの整数値を入れました (ここで見つけたリストを使用: http://www.mazama.net/scheme/v12/w32message .scm ) これらのメッセージの 1 つが受信された場合にポップアップするメッセージ ボックス。私の予想では、名前のないメッセージは単純に非推奨であり、表示されることはありませんでした。
WM_ACTIVATE
また、ウィンドウをクリックした場合にウィンドウを最小化するはずのコードをいくつか試しました。何かを台無しにしたので、ウィンドウが開くとすぐに最小化されますが、それが私をここに連れてきた理由ではありません。ウィンドウが開いて最小化されるとすぐに、Windows がメッセージ 9 を送信したことを知らせるメッセージ ボックスが表示されます。それを閉じると、メッセージ ボックスが再び表示されます。
それで、私は疑問に思いました、誰がそのメッセージをトリガーするイベントを知っていますか? または、さらに言えば、エイリアスを持たない GetMessage によって返される整数値はありますか? Windows メッセージのリストで見つけたものはすべて、上に投稿したリンクと同じ番号を省略しています。
multithreading - GetMessage の wparam 値が期待したものではない (Delphi XE4)
開発中の Delphi XE4 サービス アプリケーションがあります。サービスは、一部の長時間実行タスクのスレッドを開始し、スレッドは PostThreadMessage 呼び出しでステータスを返します。
メインの ServiceExecute ループは次のようになります。
スレッドでは、メッセージ送信は次のようになります。
メッセージは正常に到着し、メッセージ番号は正しい (msgFound = WM_USER + 1)。しかし、wParam、lParam に対して 0、6 を送信したところ、4、0 が返されました。何が欠けていますか?
注: コードには 2 つのスレッドしか実行されておらず、1 つは別のメッセージ番号を使用するタイマーであり、これが発生しても何も送信しません。
windows - アプリケーションは MessageBox 中でも GetMessage を実行しますか?
WM_TIMER の処理中にMessageBoxを呼び出しました。その結果、メッセージ ボックスにタイマーの頻度が表示されました。そのため、アプリケーションはMessageBox 中でもキューに入れられた/キューに入れられていないメッセージを処理し続けようとしていたと思います。
私は正しいですか?
MSDN によると、アプリケーションが送信スレッドとは別のスレッドにメッセージを送信している間、送信スレッドは、SendMessageが返される前、つまりターゲット スレッドが応答する前に、受信したキューに入れられていないメッセージを処理しようとします。
MessageBoxとSendMessage以外に、キューに入れられた/キューに入れられていないメッセージを処理し続けようとする関数はありますか? Window プロシージャで呼び出される関数を再入可能にする必要があるかどうかを判断するには、そのことを知る必要があります。
もう 2 つの関連する質問は、1)ウィンドウ プロシージャが返されるまでDispatchMessageは返されませんか? 2)現在のDispatchMessageがまだ返されていない場合、GetMessageは再度呼び出されませんか?
multithreading - waveOutOpen()、waveOutWrite() でスレッドに文書化されていないメッセージ 1024 が表示される
サウンド出力関数が予期しないメッセージを表示しています。これは私が何か間違ったことをしている兆候ですか?もしそうなら何?それ以外の場合、これらのメッセージが何であるかを説明する適切な情報源はありますか?
waveOutOpen() は、文書化されているメッセージ 955 MM_WOM_OPEN に続いて、文書化されていない 1024 (おそらく、https://wiki.winehq.org/List_Of_Windows_Messages によると、DDM_SETFMT、DM_GETDEFID、NIN_SELECT、TBM_GETPOS、WM_PSD_PAGESETUPDLG、WM_USER) を返します。
メインスレッドで:
結果のオーディオ スレッドでは、次のようになります。
waveOutWrite() はメッセージを送信するように文書化されていませんが、メッセージ 1024 も表示しています。