2

だから私は、他のプログラムの一種の「シェル」として機能するプログラムを持っています。コアでは、クラス、メソッド名、およびいくつかの引数が渡され、関数の実行を処理します。これは、他のプログラマーが基本的にプロセスをこのシェル サービスで実行するようにスケジュールできるようにするという考えに基づいています。1 つの問題を除いて、すべて正常に動作します。多くの場合、実行がスケジュールされているこれらのプロセスは、CPU の負荷が非常に高くなります。呼び出されたプロセスが CPU を大量に使用し始めることがあり、スケジュールのチェックや他のジョブの開始を担当するスレッドがかなりの時間実行される機会がなく、スケジューリングの問題が発生し、十分な応答性の欠如。残念ながら、実際に実行中のコードに Thread.Sleep() 呼び出しを挿入することはできません。実際にはコードを「所有」していないからです。

したがって、私の質問は次のとおりです。そのスレッドで実行されている実際のコードを変更せずに、(私が開始した) 任意のスレッドを頻繁にスリープ (解放) することは可能ですか? それを除けば、実行時に動的に実行しようとしているコードに Thread.Sleep() 呼び出しを「注入」する方法はありますか?

4

5 に答える 5

10

あまり。プロパティを使用して他のスレッドの優先度を変更してみることができPriorityますが、「スリープ」呼び出しを実際に挿入することはできません。

ありますが、使用しないことThread.Suspend()強くお勧めします。重要なリソースを保持している可能性があるため、任意の時点で別のスレッドを一時停止させたくありません。(そのため、メソッドは廃止され、あらゆる種類の警告が表示されます:)

他のタスクの優先度を下げ、潜在的に自分のタスクの優先度を上げることが、おそらく最良のアプローチです。

于 2009-06-29T12:57:07.573 に答える
4

いいえ(私の知る限り)ありませんが、スレッドのスケジューリング優先度を変更することはできます - http://msdn.microsoft.com/en-us/library/system.threading.thread.priority.aspx

スレッドを開始するときに、問題のコードを実行しているスレッドの優先度を下げます (またはスケジューリング スレッドの優先度を上げます)。

于 2009-06-29T12:59:21.797 に答える
1

Thread.Suspendを使用してスレッドを一時停止するか(非推奨で非推奨)、Thread.Priorityを変更して優先度を下げることができます。

于 2009-06-29T12:59:58.083 に答える
0

これを行うべきではありません。スレッド自体が良い考えであると判断しない限り、スレッドは Sleep() を実行すべきではありません。

とにかくあなたの問題には関係ありません。あなたの問題は、CPU の枯渇により、管理スレッドが実行されないことです。これを修正するには、それらのスレッドに高い優先度を与えるだけで十分です。各タイムスライスの最後に、OS は次に実行するスレッドを決定します。スレッドの優先度はいくぶん動的です。しばらく実行されていないスレッドは、実行されたばかりのスレッドに対して相対的に高くなります。ただし、管理スレッドのベース スレッドの優先度が高いということは、スケジュールを取得するためにこの動的ブーストを必要としないことを意味します。

それでも不十分な場合は、ワーカー スレッドの優先度を下げます。これは、新しいタイムスライスを取得する前に、ワーカー スレッドがさらに長時間休止状態になる必要があることを意味します。

最後に、新しいワーカー スレッドを開始するスレッドが非常に低い優先度で実行されるようにします。これは、システムが CPU 制限に達している場合、新しいスレッドが作成されないことを意味します。これにより、単純ですが堅牢なスロットリング メカニズムが実装されます。

于 2009-06-29T13:21:07.150 に答える
0

実際、あなたが述べていることは非常にセキュリティ上のリスクであるため、ほとんどのプラットフォームではサポートされません。一般に、他のプログラムがあなたの許可なしにあなたのステータスに影響を与えることを許可することは、適切なポリシーではありません。

可能であれば、問題のプログラムをコードで作成した独自のプロセスにロードし、そのプロセスの優先度を設定したり、スリープさせたりすることができます。私は Windows プログラミングの専門家ではないため、マイレージは異なる場合があります。

于 2009-06-29T13:03:15.720 に答える