印服务器是多线程的。数据在工作者线程中接收,而不是主UI线程。一旦读取了传入的消息数据(例如使用AContext.Connection.IOHandler.ReadLn
),如果要在UI组件中显示消息,则必须与主线程同步。如果您的Delphi版本可用,您可以使用Indy的TIdSync
或TIdNotify
类进行同步,或使用TThread.Synchronize()
或TThread.Notify()
的匿名程序重载。
例如:
uses
..., IdSync;
type
TMemoSync = class(TIdSync)
protected
FText: string;
procedure DoSynchronize; override;
end;
procedure TMemoSync.DoSynchronize;
begin
Form1.Memo1.Lines.Add(FText);
end;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
Text: String;
begin
Text := AContext.Connection.IOHandler.ReadLn;
with TMemoSync.Create do
try
FText := Text;
Synchronize;
finally
Free;
end;
end;
或者:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
Text: String;
begin
Text := AContext.Connection.IOHandler.ReadLn;
TThread.Synchronize(nil,
procedure
Form1.Memo1.Lines.Add(Text);
end
);
end;
你试过'文本:= AContext.Connection.IOHandler.ReadLn;'? – mjn 2014-09-11 06:49:22
^^会让你陷入麻烦,因为服务器执行事件不会在同一个线程环境中运行 – whosrdaddy 2014-09-11 17:25:09
是的,我曾尝试过,但我没有收到任何可能,因为我使用多接收事件? – DelphiStudent 2014-09-11 21:16:20