問題タブ [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.
python - プログラムの途中で終了する
pythoncom.PumpMessages()
私が理解していることから、この行は基本的にプログラムに永遠に待つように指示しています。私の目的では、それは機能しているようです。しかし、適切な刺激を与えられれば、プログラムを終了できるようにしたいと思います。上記の行を終了するか、プログラムの実行を停止するにはどうすればよいでしょうか。
c# - フォーカスを奪ったり、P / Invokeを使用したりせずに、メッセージ(マウスホイールなど)を別のコントロールに転送するにはどうすればよいですか?
フォーカスを奪うことなく、マウスでこのコントロールを操作しているときに、メッセージ(WM_MOUSEWHEELなど)を転送したいと思います。この問題は、IMessageFilter(アプリケーションメッセージポンプに追加される)でメッセージをインターセプトし、P / Invoke(d)SendMessage()で転送することで簡単に解決できます。問題は、P / Invokeを使用せずに同じことを実行できますか(StackOverflowで見つけたソリューションはP / Invokeを使用します)?そうでない場合、なぜですか?
以下のコードは、P/Invokeを使用した私のソリューションです。だけで使っていますnew MessageForwarder(control, 0x20A)
。
}
編集:私の答えの完全な解決策
.net - フォームがMFCアプリケーションでホストされている場合、Application.Idleが起動しないのはなぜですか?
MFCアプリケーション用の.netプラグインを作成しています。WinFormsと.net4を使用してフォームを作成しました。ユーザーがMFCアプリケーションのボタンをクリックすると、フォームが表示されます。私のコントロールの1つは、Application.Idleを使用していくつかのタスクを実行します。
問題は、Application.Idleが起動されないように見えることです。
- このシナリオで「アプリケーション」とは正確には何を指しますか?それはMFCアプリケーション全体ですか、それとも.net形式ですか?
- Application.Idleが起動しないのはなぜですか?
更新
私はそれをうまく動かすことができました、ここに2つの可能な解決策があります:
- Form.ShowDialog()を使用してフォームを表示します(したがって、フォームは独自の.netメッセージポンプを実行します)
- STAスレッドを作成し、STAスレッドでフォームを作成して、Application.Run()を呼び出します。次に、Form.Show()を使用できます(フォームは、作成されたスレッドで.netメッセージポンプを使用します。この場合は、.net STAスレッドです)。
c# - モーダル プログレス ダイアログが表示されている間に "Application.DoEvents" を呼び出しても問題ありませんか?
非同期に実行できない長いプロセスがあるため、ファイルをコピーするときのエクスプローラーと同じように、進行状況ダイアログが表示されます。ダイアログをモーダルに表示し、操作を実行し (抽象化するためにファイルのコピーと呼びます)、進行状況ダイアログを更新し、Application.DoEvents() でメッセージを送り込んで、アプリケーションのメイン フレームのペイントと応答性を維持します。
ダイアログはモーダルであるため、ユーザーは監視またはキャンセル以外のことはできません。つまり、メニュー項目を選択したり、ボタンをクリックしたりすることはできません。
私は常に、Application.DoEvents は非常に邪悪であると信じてきました。再入可能にするつもりのないコードを再入力できるからです。しかし、この場合、進行状況ダイアログはモーダルであるため、これが悪いまたは危険な解決策である理由がわかりません。
私は何かを見落としていますか、それとも Application.DoEvents を使用してメッセージを送り込むことは、モーダル ダイアログを使用する正当な行為ですか?
c# - ユーザーインタラクションを単一の方法でカプセル化する方法
単一のメソッドでインターフェースを定義する外部フレームワークを使用しています。
つまり、ユーザーインタラクション(WinForms)を含む、認証のプロセス全体が含まれます。私がやりたいことは次のようなものです:
これで、実装が簡単になり、AskTheUserForCredentials()
内部でShowErrorMessage()
使用することができます。Form.ShowDialog()
これは、実際の認証プロセスのダイアログが消え、新しい、クリックして閉じる必要のあるダイアログにエラーメッセージが表示されるため、ユーザーエクスペリエンスが非常に悪くなります。
むしろ、すべてを1つの形式で表示したいのですが、それは表示されたままで、テキストボックス/ボタンを適切に無効にし、エラーメッセージを単独で表示します。
この単一のブロッキングメソッド呼び出しでどのように実行しますか?
アップデート
これまでの最善の解決策は、内部にメッセージポンプを実装することですAskTheUserForCredentials()
。
今、私たちは皆、メッセージポンプがきれいにはほど遠いことを知っています。
このソリューションは正確にどれほど悪いですか?
何か良いですか?
更新2
メッセージポンプにはいくつかの落とし穴がありました。
醜く、CPU効果が十分ではない
ホワイトUIAutomationでの動作が非常に遅い
最終的に、プロセス全体をChrisBDとしてダイアログに委任しました(ダイアログは、最終的に成功または失敗した後にのみ閉じます)。これは、IoCを使用してGUIから認証を抽象化するのに時間がかかりましたが、最終的にはクリーンで意図したとおりに機能します。
c++ - 無限ループの Windows メッセージ ポンプ
ゲーム用の Window クラスを作成していますが、メッセージ ポンプに問題があります。
Windows が提供するメッセージ キューからイベントを取得し、関連するウィンドウに送信します。翻訳とディスパッチを行う関数は次のとおりです。
私が Win32 プログラミングについて覚えていることによると、メッセージの変換とディスパッチは、指定された WindowProc を呼び出して、メッセージの内容をパラメータとして呼び出します。これが私が指定した WindowProc です...
currWin、currhwnd、および winMap は、Window.cpp のローカル変数として定義されています。
とにかく、distributeSystemMessages() を呼び出すと、無限ループが発生するようです。
重要な注意: ゲーム ループはメッセージ処理ループ内になく、メッセージ処理コード内にもありません。メッセージ処理ループは、フレームごとに 1 回メッセージ キューを空にし、各メッセージを関連するウィンドウに送信する必要があります。
これが Window.h です...
これが Window.cpp です...
winforms - 内部でホストされているWinFormsコントロールを使用したMFCダイアログが非アクティブ化され、再度アクティブ化された場合、応答しません。
Windowsフォームユーザーを再利用するには、msdnの記事「MFCダイアログボックスでのWindowsフォームユーザーコントロールのホスト」[リンク](http://msdn.microsoft.com/en-us/library/94t3ebxz.aspx)を参照しています。 MFCレガシーアプリケーションのコントロール。派手なDDX_ManagedControlユーティリティを使用すると、コントロール(MyPanelクラス)がダイアログに埋め込まれているのを確認できます。タブを介しても100%動作します。
次に、ホスティングダイアログを別のモーダルダイアログの子にするために進みます。次に、WinFormsパネルのテキストボックスの1つがキーボードフォーカスを取得し、別のアプリケーションウィンドウ(別のプロセス)に切り替えて現在のダイアログを非アクティブ化すると、問題が発生します。 MFCダイアログを再度アクティブにすると、応答しなくなります。
問題を明確にするためのいくつかのコード://MFC子ダイアログでCWinFormsControlm_ctrl1;
いくつかの観察:
- 前述の場合、Spy ++を使用して現在のプロセスのすべてのWM_ACTIVATEXXXメッセージを監視すると、問題のある非アクティブ化と再アクティブ化が発生したときにWM_ACTIVATEまたはWM_ACTIVATEAPPメッセージがキャプチャされないことがわかりました。他のメッセージ、つまりメッセージポンプが停止しています。
- 対照的に、MFCコントロールのみを使用する通常のMFC子ダイアログの場合、1つのテキストボックスがフォーカスを取得した後に非アクティブ化と再アクティブ化が発生すると、それは引き続き応答し、すべてのWM_ACTIVATEXXXメッセージを表示できます。
- WinFormsコントロールをモーダルMFCダイアログに直接ホストすると、問題は解決します。ただし、暫定的なモーダルダイアログが必要です。私の場合は、各ツリーノードが異なるモーダルダイアログをロードするTreeViewを使用しています。
c++ - 外部アプリケーションから子ウィンドウをアタッチするときのメッセージループ(ポンプ)
子ウィンドウを外部アプリケーションにアタッチしようとしています。子ウィンドウはモードレスダイアログになります。私は外部アプリケーション(実際にはMicrosoft FSX)のソースコードを所有していないため、メッセージループまたはLRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)
親ウィンドウ自体のコールバックにフックする方法がわかりません。
アタッチするアプリケーションは独自のプロセスで実行されるので、独自のメッセージループを作成する必要がありますか、それとも親のメッセージポンプによってコールバックが呼び出されますか?
前進する正しい方法は何でしょうか?
SetWindowsHookEx
-機能に関する回答の時点で編集-
注目に値する:
vb.net - Visual Basic.NET:UIを更新するためのスレッドを作成する方法
計算量の多いタスクを処理する通常のVBの方法は、メインスレッドがUIを処理し続けている間に、バックグラウンドワーカースレッドに配置することです。
なんらかの理由で、これを逆に行う必要があると言います。メインスレッドがうなり声を上げ、バックグラウンドスレッドがUIを更新します。
これが私がこれまでに持っているものです。唯一の問題は、UIウィンドウ(Form1)が再描画されている間は、操作したり、移動したりサイズを変更したりすることもできないことです(マウスカーソルが砂時計に変わり、クリックしません)。
編集:理想的には、このようなインターフェースをクライアントに提示する必要があります
クライアントはこれを次のように呼び出します(実際には、COMを介したアンマネージC ++では、画像が表示されます)。
c# - コンソールアプリケーションのメッセージポンプ
.NETで記述された非常に単純なコンソールアプリケーションがあります。アプリケーションがオペレーターなしでバッチモードで実行される場合もあれば、「ポケットから」実行される場合もあります。バッチモードで実行している場合は、プログラムを自動的に実行できるようにするデフォルトのオプションが定義されています。オペレーターが存在する場合、ユーザーが機能のリストから選択できるようにする他のオプションがあります。
入りたくない理由で、コマンドラインパラメータは好ましくありません。代わりに、オペレーターが関数を選択できる10秒のウィンドウを作成しました。現在、単純なwhileループを使用して、「in」ストリームから入力を読み取っています。whileループがプロセッサを完全に消費しないように、最後にThread.Sleep呼び出しを追加しましたが、もっと良い方法があるかどうか知りたいです。
Windowsアプリケーション(WindowsフォームまたはWPF)には、メッセージのキューを読み取ってシステムに制御を戻すことができるメッセージポンプがあります。Visual Studio、 SAS Enterprise Guide、SQL Server Management Studioなどの頑丈なアプリケーションでさえ、アイドル状態のときにプロセッサの実質的に0%を使用します。コンソールアプリケーションで同じ効果を得ることができますか?
Thread.Sleepは機能していますが、私が言ったように、もっと良い方法があるかどうか知りたいです。
ソースコードは次のとおりです。
注:この質問はタイムアウトについては関係ありません...応答を待っている間に0%のプロセッサー時間を使用することについてです(ウィンドウ化されたアプリケーションのように)。