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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top