Wird TIdTCPServer.OnConnect vom Hauptthread aufgerufen?
Ich weiß nicht, ob es in Ordnung ist, im TIdTCPServer.OnConnectoder OnDisconnectEreignis auf Daten aus dem Hauptthread zuzugreifen . Wird diese Methode vom Hauptthread oder einem anderen Thread aufgerufen? Ich möchte die IP in a protokollieren TMemound einige Schaltflächen aktivieren oder deaktivieren.
Antworten
TIdTCPServerist eine Multithread-Komponente. Seine OnConnect, OnDisconnect, OnExecute, und OnExceptionEreignisse werden alle im Zusammenhang mit einem Arbeitsthread gefeuert , die von der Veranstaltung vertreten TIdContextObjekt. Dieser Thread verwaltet die Client-TCP-Verbindung in der TIdContext.ConnectionEigenschaft.
Das OnListenExceptionEreignis wird im Kontext eines anderen Arbeitsthreads ausgelöst, der auf Clientverbindungen wartet und die TIdContextThreads erstellt.
Ja, TIdTCPServerEreignishandler müssen beim Zugriff auf UI-Steuerelemente und andere gemeinsam genutzte Daten mit dem Hauptthread synchronisiert werden.
Ich glaube, es wird in einem eigenen Thread-Kontext aufgerufen. Besser mit Synchronize () oder Queue () zu schützen ... Beispiel:
procedure TMainForm.IdTCPSyncServerConnect(AContext: TIdContext);
var
AClientIP: string;
begin
AClientIP := AContext.Binding.PeerIP;
TThread.Synchronize(nil,
procedure
var lItem : TListItem;
begin
Inc(FClientCount);
lblClientConnections.Caption := IntToStr(FClientCount);
lItem := lstClients.Items.Add;
lItem.Caption := AClientIP;
lItem.SubItems.Add(AClientIP);
lItem.SubItems.Add(DateTimeToStr(Now));
end
);
end;