在indy TCP中发送消息

时间:2014-09-11 06:28:14

标签: delphi indy

我试图像这样发送消息

strMsg := Memo.Text;
Tclient.IOHandler.WriteLn(strMsg);

但是我如何在服务器执行事件中记录memo.text中的文本?

Remy示例很好,但我是如何使用这样的代码

procedure TChatFo.SendClick(Sender: TObject);
var
  strMsg: string;
begin
if tmemo.Text = '' then Abort;
strMsg := tmemo.Text;
Tcli.IOHandler.WriteLn(strMsg);
usertype.Clear;
end;

1 个答案:

答案 0 :(得分:2)

Indy服务器是多线程的。数据在工作线程中接收,而不是主UI线程。一旦读取了传入的消息数据(例如,使用AContext.Connection.IOHandler.ReadLn),如果要在UI组件中显示消息,则必须与主线程同步。您可以使用Indy的TIdSyncTIdNotify类进行同步,或者如果您的Delphi版本可用,则使用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;