TIdTCPServer.OnConnect 是从主线程调用的吗?
Is TIdTCPServer.OnConnect called from the main thread?
我不知道在TIdTCPServer.OnConnect
或OnDisconnect
事件中从主线程访问数据是否可以。这个方法是从主线程还是其他线程调用的?我想在 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 组件。它的 OnConnect
、OnDisconnect
、OnExecute
和 OnException
事件都在由事件的 TIdContext
对象表示的工作线程的上下文中触发。该线程管理 TIdContext.Connection
属性.
中的客户端 TCP 连接
OnListenException
事件在另一个工作线程的上下文中触发,该工作线程侦听客户端连接并创建 TIdContext
个线程。
所以是的,TIdTCPServer
事件处理程序在访问 UI 控件和其他共享数据时必须与主线程同步。
我不知道在TIdTCPServer.OnConnect
或OnDisconnect
事件中从主线程访问数据是否可以。这个方法是从主线程还是其他线程调用的?我想在 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 组件。它的 OnConnect
、OnDisconnect
、OnExecute
和 OnException
事件都在由事件的 TIdContext
对象表示的工作线程的上下文中触发。该线程管理 TIdContext.Connection
属性.
OnListenException
事件在另一个工作线程的上下文中触发,该工作线程侦听客户端连接并创建 TIdContext
个线程。
所以是的,TIdTCPServer
事件处理程序在访问 UI 控件和其他共享数据时必须与主线程同步。