TIdTCPClient/TIdTCPServer 应用程序在调试/发布复杂模式下的不同行为

问题描述 投票:0回答:1

一个非常简单的 Delphi 12

TIdTCPClient
/
TIdTCPServer
Windows 应用程序,在 OpenVPN 下,当服务器应用程序构建并在调试模式下运行时,工作正常,而当服务器应用程序构建并运行时,不工作在释放模式下(出现“连接超时”错误消息)。

服务器侦听开放端口,客户端向服务器 VPN 套接字(公共 VPN IP 和侦听端口)发送字符串消息。

这是服务器端和客户端的部分代码:

服务器端

procedure TFormServer.IdTCPServer1Execute(AContext: TIdContext);
Begin
  var StrMsgCli     := AContext.Connection.IOHandler.ReadLn(IndyTextEncoding_UTF8);
  MemoMsgClient.Text:= StrMsgCli;
End;

客户端

procedure TFormClient.SpeedButtonSendToServerClick(Sender: TObject);
Begin
  var StringToSend:= 'BlaBlaBla_123';
  IdTCPClient1.Connect;
  IdTCPClient1.IOHandler.WriteLn(StringToSend);
End;

有人可以解决这个问题吗?

delphi indy indy10
1个回答
0
投票

TIdTCPServer
是一个多线程组件。它的大多数事件(包括
OnExecute
)在工作线程中调用,而不是在主 UI 线程中调用。因此,直接访问 UI 控件(就像使用
MemoMsgClient
一样)不是线程安全的,并且必须与主 UI 线程同步,例如使用
TThread.Synchronize()
TThread.Queue()
,例如:

procedure TFormServer.IdTCPServer1Execute(AContext: TIdContext);
Begin
  var StrMsgCli := AContext.Connection.IOHandler.ReadLn(IndyTextEncoding_UTF8);
  TThread.Queue(nil,
    procedure
    begin
      MemoMsgClient.Text := StrMsgCli;
    end
  );
End;
© www.soinside.com 2019 - 2024. All rights reserved.