tidtcpserver在事件onexecute中,同步的问题? 急!! ( 积分: 50 )

  • 主题发起人 主题发起人 rzxiaojun
  • 开始时间 开始时间
R

rzxiaojun

Unregistered / Unconfirmed
GUEST, unregistred user!
我在form1上放置一个Indy TIdTcpserver作为服务器,在TIdTcpserver的onExecute方法中需要对VCL控件进行读写,比如我想在 form1.memo1上显示收到的报文;
procedure Tform1.dispmessage;
begin
form1.memo1.lines.add(....);
end;
这样我在 TidTcpserver的onExecute接收报文,通过onExecute方法的参数aThread调用aThread.Synchronize(form1.dispmessage),而Synchronize的参数是一个不能带参数的过程,那么请问我要怎么才能够把TidTcpserver在onExecute过程里面接收到的报文传递给dispmessage??
有些人也许想到在 Tform1里面定义一个private变量msg:string,然后在onExecute里面把受到的报文复制给msg;然后定义dispmessage如下:
procedure Tform1.dispmessage;
begin
form1.memo1.lines.add(msg);
end;
在onExectute里面调用aThread.Synchronize(form1.dispmessage);这种方法当然可行,可是有点怀疑的地方:假设TIdTcpserver同时受到两个客户端发送过来的报文,就会在各自的线程里面同时访问msg变量。请问这个msg变量会不会相互覆盖??会不会出现线程2改变了线程1的值?这样显示的结果肯定就错了。

--------------------------------------------------------------------------------
 
本人通过试验会出现线程2改变了线程1的值,你应该使用多个变量。
 
entercriticalsection();
form1.memo1.lines.add(msg);
leavecriticalsection();
 
在ONExecute事件里用READLN读消息,然后同步把消息写到memo中就好了~
Athread.Synchronize(DisplayData);然后在DisplayData事件中写form1.memo1.lines.add();就OK了~
 
后退
顶部