2014-09-11 214 views
1

IAM尝试发送邮件这样发送消息

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

但我怎么recive在服务器内memo.text文本执行事件?

雷米例子是不错,但我怎么用代码做这样的

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

你试过'文本:= AContext.Connection.IOHandler.ReadLn;'? – mjn 2014-09-11 06:49:22

+0

^^会让你陷入麻烦,因为服务器执行事件不会在同一个线程环境中运行 – whosrdaddy 2014-09-11 17:25:09

+0

是的,我曾尝试过,但我没有收到任何可能,因为我使用多接收事件? – DelphiStudent 2014-09-11 21:16:20

回答

2

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

但我使用代码就像我更新到线程 – DelphiStudent 2014-09-11 21:41:36