Wie ändern Priorität Listener-Thread
-
09-09-2019 - |
Frage
Ich verwende die TIdCmdTCPServer Komponente von Indy 10 zu meiner Client-Server-Anwendung zu realisieren. Das Problem ist, dass die Anforderung von Kunden kann ziemlich kompliziert sein, und dass der GUI Teil meiner Server-Anwendung sofort verliert Ansprechbarkeit. Aus der Indy Dokumentation , bekam ich, dass Indy:
Erstellt und startet Zuhörer Threads für Bindungen, die Thread-Priorität tpHighest verwenden.
Kann ich dieses Verhalten ändern?
Lösung
Wie Rob wies darauf hin, ändern sich nicht die Priorität des Listener-Thread, verringern Sie die Priorität der Worker-Threads statt. Es kann in den OnConnect () Handler des TIdCmdTCPServer So wie so zugegriffen werden:
procedure TServerForm.IdCmdTCPServer1Connect(AContext: TIdContext);
begin
// sanity checks need to go here
TIdYarnOfThread(AContext.Yarn).Thread.Priority := tpLower;
end;
Andere Tipps
Einstellen der Priorität niedriger für das Hören Thread wird nicht Ihr Problem lösen. Alle Listener-Thread tut hört, welche Aufgabe kein CPU-intensiv ist. Bis eine Verbindung zustande kommt, wird dieser Thread nicht überhaupt etwas zu tun. Sie können, dass wie Process Explorer mit einem Werkzeug bestätigen können; Ich denke, es ist die CPU-Auslastung durch Thread zeigen kann.
Mit der Prioritätseinstellung niedriger tatsächlich den Server erscheinen weniger ansprechbar, weil, wenn eine Verbindung ankommt, der Thread für diese Verbindung Hören mit niedrigerer Priorität ausgeführt werden und nicht in der Lage sein, auf der Verbindung zu arbeiten sofort. Der Kunde wird etwas länger, bevor der Server warten müssen beginnt seine Anfrage ist.
Die Anforderungen werden nicht in dem Listener-Thread behandelt. Die Listener-Thread Delegierten der meiste Arbeit an anderen Threads. Wenn Sie nur eine TCP-Bindung, dann werden Sie nur ein Listener-Thread haben, aber Sie können viele gleichzeitige Verbindungen verarbeiten. Jede Verbindung wird trotz dort durch einen separaten Thread behandelt werden ist nur ein Zuhörer.
Wie auch immer, können Sie die Priorität ändern das Serverobjekts OnBeforeListenerRun
Ereignisses durch die Handhabung. Er erhält einen Verweis auf die TIdThread
, die den Hörer Thread darstellt, so dass Sie einen anderen Wert seiner Priority
Eigenschaft zuweisen. Außerdem haben Sie den Quellcode, so könnte man hineingehen und die Definition der tpListener
Konstante ändern in IdGlobalCore.pas . Der Code verwendet diesen Wert, nicht direkt tpHighest
.