問題タブ [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 投票する
3 に答える
1188 参照

.net - Windows GUI スレッドへのメッセージの送信

Web サービス オブジェクト (SoapHttpClientProtocol から継承) を作成し、Async メソッドを使用すると、Windows GUI スレッドでコールバックが行われることに気付きました。

  1. これがどのように機能するか知っている人はいますか?
  2. どうすれば同じことを達成できますか。

GUIスレッドでコールバックが常に発生していると確信している場合、これにより、GUIフォームでInvokeRequiredをチェックする必要がなくなると思います。

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

c# - スレッド コンテキストで構築された NativeWindow の問題

メッセージ ポンプを使用して古い DLL と通信するために、NativeWindow サブクラス ('MyNativeWindow') を作成しています。私のコードは WinForms アプリケーション内で実行されますが、DLL とそのメッセージ処理を GUI の範囲外に保持したいと考えています。

アプリケーション コンテキストから MyNativeWindow を作成すると (アプリケーションのメイン フォームを作成する直前)、すべてが機能します。NativeWindow の WndProc が呼び出され、イベントが処理されます。ただし、スレッドを使用して MyNativeWindow を初期化すると、メッセージ ポンプが実行されないようです。

NativeWindow の作成に制限はありますか?

0 投票する
4 に答える
15561 参照

c# - 複数の UI スレッドを実行する

質問の一番下までスキップしてください。これは単なる追加情報です

コンポーネント (GeckoFX) を使用していくつかの Web サイトをレンダリングしていますが、これは Windows フォームでしか使用できません。描画できる WinForms オブジェクトにバインドする必要があるためです。すべての WinForms が同じスレッドで実行されているため、一度に 1 つの GeckoFX インスタンスしか使用できません。そこで、WinForm の形式で「ワーカー クラス」を作成し、そこにすべてのロジックを追加することにしました。フォームは、メイン フォームと通信する必要はありません。

これで 10 個のウィンドウを起動でき、最終的には機能しますが、1 つのスレッドで複数のインスタンスを使用できないため、他のすべてのフォームがすべての GeckoFX イベントを処理する前に、すべての新しいフォームが待機します。さらに、ブラウザは UIThread 上にある必要があります。そう:

複数の UI スレッド (フォームごとに 1 つ) を作成することはできますか?

私は誰かがそれをやっているのを見たことがあります ([編集: '悪い' リンクを削除しました]) が、誰も彼のコード サンプルを動作させたことはありません。それを機能させた人は、もともとこの種のことを行うために何らかの形のカスタムメッセージポンピングを使用していましたが、そのようなことを達成する方法はわかりません.

0 投票する
6 に答える
54609 参照

c# - メッセージ ポンプとは

このスレッド(約 1 年前に投稿) では、非対話型セッションで Word を実行する際に発生する可能性のある問題について議論しています。そこに与えられた(非常に強い)アドバイスは、そうしないことです。ある投稿では、「Office API はすべて、モニター、キーボード、マウス、そして最も重要なメッセージ ポンプを備えた、デスクトップ上の対話型セッションで Office を実行していることを前提としています」と述べられています。私はそれが何であるか分かりません。(私が C# でプログラミングを始めて約 1 年です。他のプログラミング経験は主に ColdFusion でした。)

アップデート:

私のプログラムは、多数の RTF ファイルを処理して、医療レポート番号の作成に使用される 2 つの情報を抽出します。RTF の書式設定手順がどのように機能するかを理解しようとするのではなく、Word でそれらを開いてそこからテキストを引き出すことにしました (実際に GUI を起動する必要はありません)。ときどき、プログラムが 1 つのファイルの処理中に問題を起こし、その文書に添付された Word スレッドを開いたままにしました (その文書をシャットダウンする方法をまだ考えなければなりません)。プログラムを再実行すると、もちろん、そのファイルを使用しているスレッドがあるという通知を受け取りました。読み取り専用のコピーを開きたいですか? 私が「はい」と答えると、Word GUI がどこからともなく突然現れ、ファイルの処理を開始しました。なぜそうなったのか不思議に思っていました。

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

c# - .NET Windows サービスのメッセージ ポンプ

キオスク アプリケーションのすべての外部ハードウェア I/O を処理する C# で記述された Windows サービスがあります。新しいデバイスの 1 つは、ネイティブ DLL の API を備えた USB デバイスです。適切な P/Invoke ラッパー クラスを作成しました。ただし、この API は Windows アプリケーションへの HWnd で初期化する必要があります。これは、メッセージ ポンプを使用して非同期イベントを発生させるためです。

Windows メッセージ ポンプに依存しない API を提供するようハードウェア メーカーに要求する以外に、この API に渡すことができる Windows サービスの新しいスレッドでメッセージ ポンプを手動でインスタンス化する方法はありますか? ? 実際に完全なアプリケーション クラスを作成する必要がありますか?それとも、メッセージ ポンプをカプセル化する下位レベルの .NET クラスがありますか?

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

c# - Application.DoEventsを使用してApplication.Runを「エミュレート」します

困っています。Application.DoEventsを使用してApplication.Runの呼び出しをエミュレートしようとしています...これは悪いように聞こえますが、質問に対する代替ソリューションも受け入れます...

Application.Runのようにメッセージポンプを処理する必要がありますが、メッセージ処理の前後にコードを実行する必要があります。これがコードの主な重要なスニペットです。

このコードスニペットは、メインルーチンによって実行されます。実は、別々のスレッドで実行されるカーネルクラスのリストがあります。これらのスレッドは、OpenGLでレンダリングするためのフォームを処理します。バリアを使用してすべてのカーネルスレッドを同期する必要がありますが、これは完全に機能します。もちろん、作成されたすべてのフォームについて、メインスレッド(メインルーチン)でフォームメッセージを処理する必要があります。実際、Application.DoEvents()を呼び出してジョブを実行します。

ここで、上記のスニペットを変更して、Application.RunのようにApplication.DoEvents()を呼び出すCPUを100%消費せずに、共通のフォーム(単純なダイアログボックス)を作成する必要があります。

目標は、上記のスニペットが到着時にメッセージを処理し、最大FPSを取得しようとせずに、必要な場合にのみレンダリングを発行する(バリアを解放する)ことです。可能な限りレンダリングするために、厳密なループに切り替える可能性があるはずです。

どうしてそれが可能でしょうか?

注:OpenGLコンテキストはメインスレッドで作成されるため、上記のスニペットはメインルーチンで実行する必要があります。別のスレッドでスニペットを移動し、Application.Runを呼び出すと、非常に不安定でバグが発生します...

0 投票する
7 に答える
17573 参照

c++ - Windows によってサイレントにキャッチされる例外、手動で処理する方法は?

メッセージ ポンプ内で例外がスローされたときに、Windows が黙って例外を食べ、アプリケーションの実行を継続できるという問題があります。たとえば、テスト用の MFC MDI アプリケーションを作成し、OnDraw をオーバーライドしました。

アプリケーションを実行すると厄介なエラー メッセージが表示されることが予想されますが、実際には何も表示されません。プログラムは問題なく動作しているように見えますが、出力ウィンドウを確認すると次のように表示されます。

Test.exe の 0x13929384 での初回例外: 0xC0000005: アクセス違反の書き込み場所 0x00000000。
Test.exe の 0x77c6ee42 での初回例外: 0xC0150010: 非アクティブ化されているアクティブ化コンテキストは、現在の実行スレッドに対してアクティブではありません。

アプリケーション コンテキストの例外が発生する理由はわかっていますが、それが黙って処理されるのはなぜですか? これは、アプリケーションが使用中に重大な問題を抱えている可能性があることを意味しますが、ユーザーが問題を報告することは決してないため、私たちはそれを知ることはありません.

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

.net - .NET Framework を使用した音声認識にはメッセージ ポンプが必要ですか?

私はプラグイン (dll ファイル) を作成しており、そのインターフェイス/ダイアログとして WinForm を作成しています。メッセージ ポンプが必要な場合、どこでどのように作成すればよいですか?

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

java - pumpevents - カスタマイズされたルック アンド フィール Java がシステム リソースを大量に消費する

私は自分の GUIをここで見るようにしていますが、Java の pumpevents メソッドがあまりにも多くの時間を話していることがわかりました。解決策はありますか???? ポンプ イベント 詳細ポンプ イベント 詳細

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

c# - Alt-Tabまたはタスクバーにプログラムが表示されないようにする方法

バックグラウンドで実行する必要のあるプログラムがあり、ユーザーがRDPセッションに接続すると、環境のセットアップを行ってからプログラムを起動します。プログラムが閉じられると、ハウスキーピングが実行され、セッションがログオフされます。

私が現在行っている方法は、ターミナルサーバーにこのアプリケーションを起動させることです。これは、コンソールウィンドウが表示されないようにするためのWindowsフォームアプリケーションとして構築されています。

タスクバーに項目がなく、alt-tabに何も表示されないので、私はこれが本当に好きです。ただし、これを行うために、次のような関数へのアクセスを断念しました。Windowsメッセージ(Likeまたは)をvoid WndProc(ref Message m) 聞くことができず、使用するハンドルがありません。コードをより堅牢にして、ハウスクリーニングを実行できるようにします。ユーザーがプログラムを閉じる前にログオフするか、セッションから切断した場合。WTS_REMOTE_DISCONNECTWTS_SESSION_LOGOFFbool WTSRegisterSessionNotification(IntPtr hWnd, int dwFlags);

ケーキを食べて食べる方法についてのアドバイスはありますか?