問題タブ [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.
c# - 同じスレッドでApplication.Exit後にApplication.Runが機能しない
私の仕事の要件は、最初にユーザーからいくつかのデータを取り込み、彼を認証して別のフォームを開始するスプラッシュ画面を表示することです。そのため、Application.Run を使用してスプラッシュ スクリーンを開始しています。完了したら、Application.Exit を呼び出してから、新しいフォームに対して再度 Application.Run を呼び出します。しかし、これは新しいフォームを開始しません。新しいスレッドを作成し、その ApartmentModel を STA として割り当てて、新しいフォームを開始します。
Application.Exit を呼び出した後に Application.Run が機能しない理由を知りたいですか?
サンプルコード:
c++ - Win32メッセージポンプ、DispatchMessage()はメッセージキュー全体を処理しますか、それともトップメッセージのみを処理しますか?
だから私はWin32メッセージポンプを読んでいて、DispatchMessage()関数がメッセージキュー全体を処理するのか、それともキューの一番上にあるメッセージだけを処理するのか興味がありましたか?
たとえば、次のようなループを見たことがあります。
この例では、すべてのメッセージが処理されますか、それともこのループ構造により、フレームごとに1つのメッセージのみが処理されますか?
一度に1つのメッセージのみを処理する場合、すべてのメッセージが確実に処理されるように、if(PeekMessage)ステートメントをwhileループに変更する必要がありますか?:
c# - 「Invoke」と「BeginInvoke」が呼び出されますが、解決されません
ソフトウェアの GUI スレッドを担当しています。基になる API から常にポーリングする必要がある GridView データ内に表示する必要があります。データを更新するというメソッドを作成し、and/orSync()
を使用してスレッド セーフにしようとしました。このメソッドは、約 5 秒ごとにタイマーによって呼び出されます。BeginInvoke
Invoke
Sync
の本体がSync
呼び出されることはありません。何らかの理由で、私の要求がメッセージ ポンプから取り出されないように見えるからです。コード:
ログは次のようになります。
他のメッセージは印刷されません。
についても同じですBeginInvoke
。「End Invoke ...」は出力されますが、「inside body ...」は出力されません。
Unity3D と MonoDevelop の上で実行しています (これで何かが変わる場合)。
c# - STA スレッドが COM メッセージをポンピングする原因となるブロッキング操作はどれですか?
COM オブジェクトが STA スレッドでインスタンス化される場合、スレッドは通常、他のスレッドとの間で呼び出しをマーシャリングするためにメッセージ ポンプを実装する必要があります (こちらを参照)。
メッセージを手動でポンピングするか、すべてではないが一部のスレッドブロッキング操作が待機中に COM 関連のメッセージを自動的にポンピングするという事実に依存することができます。多くの場合、ドキュメントはどれがどれであるかを判断するのに役立ちません (この関連する質問を参照してください)。
スレッド ブロック操作が STA で COM メッセージを送信するかどうかを判断するにはどうすればよいですか?
これまでの部分的なリスト:
ポンプを行うブロッキング操作*:
Thread.Join
WaitHandle.WaitOne
/WaitAny
/WaitAll
(WaitAll
ただし、STA スレッドから呼び出すことはできません)GC.WaitForPendingFinalizers
Monitor.Enter
(したがってlock
) - いくつかの条件下でReaderWriterLock
- ブロッキングコレクション
ポンピングしないブロック操作:
Thread.Sleep
Console.ReadKey
(どこかで読んで)
* Noseratio の回答によると、ポンプを実行する操作でさえ、非常に限定された未公開の COM 固有のメッセージ セットに対してポンプを実行するということです。
c# - パラメータをサポートするカスタム メッセージ ポンプを追加するにはどうすればよいですか?
これは、次の質問に関連しています: カスタム メッセージ ポンプを作成するには?
基本的に同じメッセージ ポンプが必要ですが、入力パラメーターもサポートできる必要があります。上記の質問からの回答は、パラメーターを受け入れない Action() デリゲートのみをサポートします。アクションにパラメータを渡せるようにしたい。パラメータなしのバージョンは次のとおりです。
これを行う正しい方法は何ですか?BlockingCollection に Action の代わりにカスタム クラスを格納することを考えていました。
しかし、それは不格好に思えます。加えて、action(parameter) を呼び出せるようにするために、アクションを取得するときにパラメータの型を把握するための switch ステートメントも必要になります。また、複数のパラメーターをサポートしたい場合はどうすればよいですか? 私はobject[] parameters
それを使用する必要がありますか?きっともっと良い解決策がありますか?
c# - Windows Message Pump のクリーン メッセージ
- Windows Message Pump についてはよくわかりませんが、Message Pump を使用してイベントがトリガーされると思います。
Web ブラウザー コントロールがいくつかの Web サイトに移動すると、ドキュメント補完のさまざまなイベントが発生します。WebBrowser_Document_Completed()で必要なものを取得したら、それ以降のすべてのドキュメント補完を無視したいと思います。
- どうすればできますか?
Document_Completed(...)にMessageBox()を表示すると、複数のメッセージ ボックスが表示され、並列スレッドで実行されているように見えますが、デバッグすると、常にメイン スレッドで実行されることがわかります。
- 他の 2 つのスレッドはいつ作成されますか?
また、閉じるを押すとウィンドウは閉じますが、プロセスはバックグラウンドで実行されています。他のスレッドは使用していませんが、デバッグ時に他の 2 つのスレッドが表示されます。