問題タブ [message-pump]

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.

0 投票する
2 に答える
2563 参照

windows - Windows メッセージの送受信

Windows メッセージは、Windows OS 上のアプリケーションに通知する良い方法のようです。実際にはうまく機能しますが、いくつかの質問が頭に浮かびます。

SendMessage ルーチンのlparamに構造化データを指定する方法(多くのメッセージ コードと同様)。つまり...もちろん、パラメーターはポインターですが、プロセスはどのようにアクセスするのでしょうか? メッセージを送受信するプロセスによってロードされたDLLによって割り当てられているのでしょうか?

メッセージの構造化パラメーターを (送信者と受信者の間で) 共有することは可能ですか? それらは、送信操作とピーク操作の間でマーシャリングされますか? この場合、構造化パラメーターを変更することで、呼び出し元からデータを返すことは可能ですか? これは、PostMessage ルーチンの代わりに同期的に実行されるため、SendMessage で役立ちます。

他にも疑問...

PostMessageやSendNotifyMessageとの違いは何ですか?

メッセージ ポンプの処理中に、アプリケーションがそれ自体に SendMessage を呼び出した場合、デッドロックが発生する可能性はありますか?

0 投票する
1 に答える
2973 参照

c# - 「オブジェクトは現在他の場所で使用されています」という例外が発生するのはなぜですか?

C#WinFormsアプリケーションがあります。この例外は、メインUIフォームを起動する前にDevExpress XtraMessageBoxが表示されたときに、静的なvoid Main()メソッド内でスローされます。以下はコードです(簡略化):

これはDevExpressコントロールですが、実際には次の呼び出しで例外がスローされます。

例外は一貫してスローされません。特定のマシンで再現できますが、例外の前にMicroSoft MessageBox.Show()を追加してデバッグ情報を表示すると、例外は発生しなくなります。スタックトレースは次のとおりです。

更新: UI作業を行う前に、Application.Run()が実行されていることを確認して解決しました。このようにして、メッセージループ/ポンプが起動します。これで、Application.Run()がスプラッシュフォームを起動します。これは軽量で高速です。次に、スプ​​ラッシュフォーム内からメインフォームをインスタンス化し、アクティブにして、スプラッシュフォームを非表示にします。

0 投票する
3 に答える
1708 参照

c# - C#ですべての例外を試す/キャッチする

C# の UI アプリで未処理の例外をすべてキャッチして、ログに記録し、メールで送信してアプリを再起動できるようにしたいと考えています。

どうすればこれを簡単に行うことができますか?私は試した:

しかし、それはいくつかの例外を許します。

0 投票する
1 に答える
3136 参照

c# - 独自のメッセージ ポンプでフォームを実行する方法は?

私は、自分自身とは異種であり、独立して実行される多くのフォームを開く必要があるアプリケーションを持っています。その後、私のアプリケーションは長時間実行される操作をブロックします (これらの操作を非同期にすることはできません)。したがって、これらのフォームを独自のメッセージ ポンプを使用して別のスレッドで実行したいと考えています。

それを行う方法はありますか?

0 投票する
2 に答える
319 参照

windows - Windows アプリの UI 応答性の測定

WinForms/Windows アプリケーションの応答性の指標はありますか?

メッセージループがブロックされている時間の割合のようなものですか?

どのように入手できますか?

0 投票する
8 に答える
35945 参照

c# - 長時間の操作中にWindowsメッセージをポンピングしますか?

実行している大きな操作で次のメッセージが表示されます。

CLRは、COMコンテキスト0x1fe458からCOMコンテキスト0x1fe5c8に60秒間移行できませんでした。宛先コンテキスト/アパートメントを所有するスレッドは、ほとんどの場合、非ポンピング待機を実行しているか、Windowsメッセージをポンピングせずに非常に長時間実行されている操作を処理しています。この状況は一般にパフォーマンスに悪影響を及ぼし、アプリケーションが応答しなくなったり、メモリ使用量が時間の経過とともに継続的に蓄積したりする可能性さえあります。この問題を回避するには、すべてのシングルスレッドアパートメント(STA)スレッドで、ポンピング待機プリミティブ(CoWaitForMultipleHandlesなど)を使用し、長時間実行される操作中にメッセージを定期的にポンピングする必要があります。

長時間の操作でこのエラーが発生しないように、Windowsメッセージを送信するにはどうすればよいですか?

0 投票する
2 に答える
3921 参照

c# - プログラムで2番目のメッセージループを終了するにはどうすればよいですか?

C#で非同期的に低レベルのメッセージを処理/フィルタリングするための2番目のメッセージループを作成しようとしています。これは、非表示のフォームを作成し、そのHandleプロパティを公開してフックし、別のスレッドで2番目のメッセージループを実行することで機能します。現時点では結果には非常に満足していますが、2番目のループを適切に終了することができません。唯一の回避策は、IsBackgroundプロパティをtrueに設定することでした。そのため、2番目のスレッドは、メインアプリケーションの終了時に(保留中のメッセージをすべて処理せずに)単純に終了します。

問題は、2番目のApplication.Run()が戻るように、そのメッセージループを適切に終了する方法です。別のApplicationContextを作成し、さまざまなイベント(Application.ApplicationExit、Application.ThreadExit、ApplicationContext.ThreadExit)を制御するさまざまなアプローチを試しましたが、デバッグできない競合状態ですべて失敗しました。

ヒントはありますか?ありがとう

これはコードです:

メインのFormコンストラクターで次のように使用します。

編集:私の答えの完全な解決策。

0 投票する
2 に答える
789 参照

c++ - すべての VCL フォームにスレッド用の独自のメッセージ ループ/ポンプが必要ですか?

最新のプロジェクトで MVP パターンを実装しようとしています。現在、C++ Builder 2007 に付属の VCL ライブラリを使用しています。私の考えでは、Application->Run() を実行する必要はなく、さらに悪いことに、メイン フォームを作成してそのフォームをループする Application->CreateForm() も必要ありません。メインフォームは必要ありません。代わりに、メインのPresenterが必要です。

私の質問は、スレッド化された TForms を作成する方法になりますか?

オプション 1: メッセージ ループ (プレゼンター) が 1 つしかない場合、システム内のすべてのランダム スレッドは、このメイン スレッドにメッセージを投稿し、フォームを作成する必要があります。

オプション 2: すべてのフォームに独自のメッセージ ループがあります。ランダムスレッドは、必要に応じて新規作成および削除できるようになりました。メッセージの投稿は、それらの間の通信に引き続き使用されます。

オプション2が推奨される場合、このアプローチの実装に関するアドバイスはありますか?

編集: newを 使用してフォームを作成し、ループが機能するようにするには、次のように変更するにはどうすればよいですか?

0 投票する
1 に答える
511 参照

wpf - WPFアプリケーションは、メッセージポンプを必要とするAPIを呼び出します。Dispather.Run()は問題を引き起こします

WPF以外のベンダーライブラリを使用するWPFアプリがあります。私のアプリは、ライブラリが起動するイベントを受信しません。これはメッセージポンプが必要だからだと言われています。

別の(非常によく似た)質問では、受け入れられた回答はSystem.Windows.Threading.Dispatcher.Run()を使用することを提案しました。

ただし、その呼び出しを追加すると、ウィンドウがポップアップしません。アプリは効果的にバックグラウンドで処理されているため、タスクマネージャーでシャットダウンする必要があります。

私はここで本当に困惑していて、それを調査する方法さえわかりません。どんな助けでも大歓迎です。