TIdTCPServer.OnConnect 是从主线程调用的吗?

Is TIdTCPServer.OnConnect called from the main thread?

我不知道在TIdTCPServer.OnConnectOnDisconnect事件中从主线程访问数据是否可以。这个方法是从主线程还是其他线程调用的?我想在 TMemo 中记录 IP,并启用或禁用一些按钮。

我相信,它在自己的线程上下文中被调用。最好使用 Synchronize() 或 Queue() 来保护...示例:

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;

TIdTCPServer 是一个 multi-threaded 组件。它的 OnConnectOnDisconnectOnExecuteOnException 事件都在由事件的 TIdContext 对象表示的工作线程的上下文中触发。该线程管理 TIdContext.Connection 属性.

中的客户端 TCP 连接

OnListenException 事件在另一个工作线程的上下文中触发,该工作线程侦听客户端连接并创建 TIdContext 个线程。

所以是的,TIdTCPServer 事件处理程序在访问 UI 控件和其他共享数据时必须与主线程同步。