問題タブ [dispatcher]
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.
wpf - WPFでDispatcherオブジェクトを使用するのは何ですか?
WPFでDispatcherオブジェクトを使用するのは何ですか?
c# - WPF Dispatcher.Invoke 'ぶら下げ'
ディスパッチャーを使用して UI スレッドで呼び出しを呼び出そうとすると、WPF アプリケーションが「ハング」したり、Wait 呼び出しでスタックしたりするように見える、やや複雑な WPF アプリケーションがあります。
一般的なプロセスは次のとおりです。
- ボタンのクリック イベントを処理する
- プレゼンターと UI の新しいインスタンスを作成し、Disconnectメソッドを呼び出す新しいスレッド (STA) を作成します。
- 切断してから、名前という名前の UI のプロパティを設定します
- Name のセッターは、次のコードを使用してプロパティを設定します。
私の問題は、ディスパッチャーの呼び出しメソッドが呼び出されると、毎回ハングしているように見え、呼び出しスタックは、呼び出し実装内でスリープ、待機、または参加していることを示していることです。
それで、私が間違っていること、明らかであるかどうか、またはこのプロパティ(およびその他)を設定するためにUIスレッドを呼び出すより良い方法がありますか?
編集:解決策は、スレッド デリゲートの最後 (たとえば、作業が実行されていた場所) で System.Windows.Threading.Dispatcher.Run() を呼び出すことでした - 助けてくれたすべての人に感謝します。
c - 関数へのポインタに対するコンパイラのサポートが壊れている場合、どのようにディスパッチャを作成すればよいですか?
コマンド インターフェイスを介してデバイスを制御する組み込みアプリケーションに取り組んでいます。私は VC でコマンド ディスパッチャーを嘲笑し、満足のいく動作をさせました。しかし、コードを組み込み環境に移したとき、コンパイラーの関数へのポインターの実装が壊れていることがわかりました。
これが私が最初にコードを実装した方法です(VCで):
関数ポインターを使用しない場合、私の唯一の望みは、switch()/case ステートメントを使用して関数を呼び出すことです。しかし、大きな switch() ステートメントを手動で維持する必要は避けたいと思います。
私が考えていたのは、すべての COMMAND_ENTRY 行を別のインクルード ファイルに移動することです。次に、そのインクルード ファイルをさまざまな #define および #undefines でラップします。何かのようなもの:
この状況を処理するためのより良い方法を見ている人はいますか? 残念ながら、「別のコンパイラを入手する」という選択肢はありません。:(
--- 編集して追加: 明確にするために、特定の組み込み環境は、コンパイラが「関数ポインタ テーブル」を作成することになっているという点で壊れています。これは、ポインタを介して関数への呼び出しを解決するためにコンパイラによって使用されます。残念ながら、コンパイラは壊れており、正しい関数テーブルを生成しません。
そのため、関数アドレスを抽出して呼び出す簡単な方法がありません。
--- 編集 #2: ああ、はい、void *(set|get)_dispatcher の使用は、func ポインターの typedefine に問題があるかどうかを確認するための私の試みでした。もともと、持っていた
winforms - System.Windows.Threading.Dispatcher と WinForms?
アプリケーションSystem.Windows.Threading.Dispatcher
の UI スレッドで動作しますか?WinForms
はいの場合、なぜですか? コンポーネントのように見える WindowsBase.dll から来ていWPF
ます。
そうでない場合、どうすれば作業ユニットを UI スレッドに戻すことができますか? を見つけましControl.BeginInvoke()
たが、元のスレッドを参照するためだけにコントロールを作成するのは不器用です。
wpf - Dispatcher.DisableProcessing の実用化?
WPFでのDispatcher.DisableProcessingの一般的な実際の使用は何ですか? コードで複雑な UI を構築するときにレンダリングとレイアウトを一時停止するために使用できますか?
wpf - 複数のWPFディスパッチャの1つを停止するには?
いくつかのバックグラウンド スレッド (実際にはインプロセス WCF サービス) を備えたアプリがあります。各スレッドは、いくつかの WPF クラスを使用するために独自の Dispatcher を実行します (いくつかのオーディオ/ビデオ ファイルを処理する MediaPlayer オブジェクト。BeginInvoke でいくつかのデリゲートをキューに入れ、最後に Dispatcher.Run を呼び出します)。処理が完了したら、スレッドが終了できるようにディスパッチャーをシャットダウンします。BeginInvokeShutdown を呼び出すと、アプリ内のすべてのディスパッチャーがシャットダウンされ、アプリが閉じられます。
ディスパッチャがメッセージ ループを終了するように、私にできることはありますか?
wpf - WPFディスパッチャーはマルチスレッドの問題の解決策ですか?
コードでロックを使用することについて非常に悪い気持ちがありますが、WindowBaseのディスパッチャーが存在し、どこでも使用したいと思っています。
たとえば、PRISMのEventAggregatorでイベントを公開するマルチスレッドシングルトンWCFサービスを使用すると、ペイロードは不変であり(データのみ)、ディスパッチャーを持つすべてのスレッドは、独自のディスパッチャーでデッドロックが発生することなく、イベントを適切に取得できます。(UIスレッドだけでなく、データベース呼び出しのあるスレッド、サービス呼び出しのあるスレッド、ログに記録するスレッド、またはUIをフリーズしたくないため、遅い呼び出しのある他のスレッドもあります)。
しかし、私の問題は、このディスパッチャーがWPFと結合されているため、どこでも使用すると少し罪悪感を感じることです。ディスパッチャーは、私のユースケース用に作成されたものではないと感じています。
WPFと組み合わせていない別のDispatcher実装が存在しますか?またはそれを悪用しても大丈夫ですか?
ありがとう、
アップデート
Paul Stovellが私に提供する解決策は、インターフェイスIDispatcherとWpf Dispatcherのアダプターを作成することです。これにより、テストが容易になります。このソリューションは、テストをリファクタリングし、テストでSynchronousDispatcherAdapterを使用できるようになったため、私にとっては良かったです(おかげで、テストでWPFのディスパッチャーを使用する必要がなくなりました)。
マルチパブリッシャー/サブスクライバーパターン(PRISMを使用)を使用しているため、BackgroundWorkerの代わりにDispatcherを使用することは理にかなっています。また、Dispatcherのおかげで、すべてのイベントハンドラーは、イベントにサブスクライブするスレッドで呼び出されます。これは、マルチスレッドの問題が発生する可能性がある唯一のポイントが私のイベントのペイロードにあることを意味します(私は彼を不変にしました)。
私のさまざまなスレッドは、それらの間で直接通信するのではなく、イベントをパブリッシュおよびサブスクライブするだけです。したがって、データベース呼び出し、ログ呼び出し、サービス呼び出し、UI呼び出しは異なるスレッドで実行され、相互に認識しません(サブスクライブしてパブリッシュするイベントについてのみ認識します)。
UIからリポジトリにいくつかの呼び出しを行う場合、バックグラウンドワーカーは理にかなっています。
しかし、私はこのサブスクライバー/パブリッシャーパターンを使用することを好むため、BackgroundWorkerを使用せずにデザインを見つけたいと思っています(コードが読みやすくなると思います)
silverlight - Silverlight2でHttpWebRequestを使用しようとしたときのエラー
非同期呼び出しからフォームに書き込もうとしています。私がオンラインで見た例は、これは機能するはずですが、エラーが発生し続けることを示しています。
最初に、Disbatcherがpを呼び出すことはありませんが行われる呼び出し。次に、req.EndGetResponse(a)の呼び出しでSystem.Security.SecurityExceptionを取得します。
問題の原因は何ですか?
c# - WPF で Dispatcher を呼び出す際の問題
バックグラウンド プレゼンター スレッドから更新する必要がある UI コードがいくつかあります。バックグラウンド スレッドから、UI でプロパティを設定します。
次に、私のセットは次のとおりです。
次のエラーが表示されます。
The calling thread cannot access this object because a different thread owns it.
私の理解ではDispatcher
、さまざまなスレッドでの呼び出しを処理するので、このエラーは私を少し困惑させます。ありがとう!
c# - WPF: タイマーを使用してスレッド内にキューを作成する
私が現在取り組んでいるソフトウェアプロジェクトを参照してください。
基本的にタイマーでキャンバスを移動する以下のメソッドがあります。
現在、別のライブラリから、これらのメソッドは次のように呼び出されます。
もちろん、これらのアニメーションを次々と発生させたいのですが、2 番目のメソッド (この場合は) が呼び出されたときに のdt.Tick
イベント ハンドラーが上書きされているため、2 番目のメソッドのみが実行されます。したほうがいい。DispatchTimer
TurnLeft(90)
dt
メソッドをそのキューにプッシュおよびポップして、 (DispatchTimer
タイマーが)それらを1つずつ実行できるようにするある種のキューを作成する必要があります...「キュー」にある順序で
これを行う方法はありますか?私はここで正しい軌道に乗っていますか、それとも完全にコースから外れていますか?