GUI イベントを特定のスレッドに渡すにはどうすればよいですか? GUI イベントとは、サブフォームを開く、別のタブを選択する、フォームを最小化/最大化する、フォーカスを変更するなどのことを意味します。
作業中のスレッドがデータを取得するときに、そのスレッドにリソースを絞り込んで、アプリケーション内の他のプロセスまたはスレッドからのそれらのリソースを拒否できますか?
履歴:
私の質問で ここでは、重要なスレッドでハングアップを引き起こしているメイン フォームへの呼び出しに関係しているシナリオについて説明します。その後、「BeginInvoke」のオプションがあることが明らかになりました。
今では、BeginInvoke によって途中まで到達したものの、重要なスレッドでのハングアップを避けることができないことに気付きました。「クリティカル スレッド」とは、サイクルに約 60 ミリ秒かかりますが、130 ミリ秒が経過する前にサイクルを終了する必要があるスレッドを指しています。ループし、データ リストをポーリングします。データが表示されてから処理が完了するまで、通常 40 ~ 60 ミリ秒かかります。
実行のステータスでユーザーを更新するために、私のフォームで BeginInvokes をスローする 2 番目のスレッドがありました(そして、技術的には、元に戻す予定です)。私は現在、デバッグ目的でそれを行っていません。
プロファイリングを行ったところ、ほとんどの場合、処理時間を 100 ミリ秒未満に抑える必要があることに気付きました。これは、アプリケーションがデータの次のパッケージが表示されるまでに (100 ミリ秒ごとに) 結果を出力する必要があるためです。この例では、それを 130ms に遅くしました)。フォーカスを変更したり、フォームを最小化/最大化したりしてフォームを操作すると、処理時間が 1 秒を超えるスパイクが表示されます。これは、最小化や最大化、またはその他の再描画イベントなどのばかげたことが、私の貴重な時間をすべて略奪しているためだと思います。
プラットフォーム:
WinForms で Visual C# 2008 を使用しています。ターゲット マシンは Windows XP を実行します。Windows エクスプローラーを閉じて、アプリケーションを通常、高、およびリアルタイムの優先度で実行しようとしましたが、フォームを操作すると、ほぼ同じ影響が見られます。
編集 Thread.CurrentThread.Priority を使用して、ワーカー ループ中の重要なタイミングで優先度を調整しようとしました。これはどういうわけか私の GUI からそれらのリソースを奪うことができず、GUI の再描画を伴う操作は依然として貧弱なワーカー スレッドを支配しています。