リスナースレッド優先順位を変更する方法
-
09-09-2019 - |
質問
私は私のクライアント・サーバ・アプリケーションを実現するためにインディ10のTIdCmdTCPServerコンポーネントを使用します。この問題は、クライアントからの要求がかなり複雑になることができるということですし、私のサーバーアプリケーションのGUI部分はすぐに応答性を失うこと。 インディドキュメントでから、私はあることを得ましたインディます:
は、スレッドの優先tpHighestを使用してバインディングのリスナー・スレッドを作成し、開始します。
私はその動作を変更することはできますか?
解決
、代わりにワーカースレッドの優先順位を下げ、リスナースレッドの優先順位を変更しないでください。
:これはそうのような TIdCmdTCPServer のインスタンスののOnConnect()のハンドラにアクセスすることができますprocedure TServerForm.IdCmdTCPServer1Connect(AContext: TIdContext);
begin
// sanity checks need to go here
TIdYarnOfThread(AContext.Yarn).Thread.Priority := tpLower;
end;
他のヒント
リスニングスレッドの優先順位が低く設定すると、あなたの問題を解決することはできません。スレッドがやっているすべてのリスナーは、CPU集約型の作業ではありませんこれは、聞いています。接続が到着するまで、そのスレッドはまったく何もしていません。あなたは、プロセスエクスプローラのようなツールを使用していることを確認することができるかもしれ。私はそれがスレッドによってCPU使用率を表示することができると思います。
実際にあなたのサーバが表示されることがあり、より低い優先度を設定するの少ないの接続が到着したときに、その接続をリッスンスレッドが低い優先順位で実行されますと、接続上で動作することができなくなりますので、応答すぐに。クライアントは、サーバーがその要求の処理を開始する前に少し長く待たなければなりません。
の要求は、リスナーのスレッドで処理されていません。リスナーは、他のスレッドに委譲作業のほとんどを通します。あなただけの1つのTCPバインディングを持っている場合は、あなただけのリスナーのスレッドがあるでしょうが、あなたは、多くの同時接続を処理することができます。各接続はそこだけのリスナーであるにもかかわらず別のスレッドによって処理されます。
とにかく、あなたはサーバーオブジェクトのOnBeforeListenerRun
イベントを処理することにより、優先順位を変更することができます。これは、リスナースレッドを表しTIdThread
への参照を受け取り、あなたはそのPriority
プロパティに異なる値を割り当てることができます。あなたが行くと、のIdGlobalCore.pas の中tpListener
定数の定義を変更することができるようにまた、あなたは、ソースコードを持っています。コードは、その値を使用して、直接tpHighest
ない。