indy IdTCPServer的第二个疑问(50分)

  • 主题发起人 主题发起人 masm
  • 开始时间 开始时间
M

masm

Unregistered / Unconfirmed
GUEST, unregistred user!
IdTCPServer支持多线程,在有数据到来的时候IdTCPServer.OnExecute引用Form1.IdTCPServer1Execute(AThread: TIdPeerThread);这个过程,假设这个过程中有变量
VAR
A,B:Integer;
一段代码;
A:=1;//----------------1
...
A:=A+2;//---------------2
...
B:=A;//------------------3
...
那么,一个线程将执行到3的时候,刚好有另一个线程执行到1,那么B=1,出错了!
怎么办?
 
同步、临界区、信号灯 都可以解决
 
1、可以将变量声明成线程私有的
2、或者变量不是私有的,就要用到:互斥,信号量,同步等等
 
但是奇怪的是,indy的那个聊天demo中根本就没用同步措施!!哪位大虾能对此有比较深刻的阐述?
 
例如
private
public
aa: string;
end;

procedure TFrmMain.IdTCPServerExecute(AThread: TIdPeerThread);
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
aa := AThread.Connection.ReadLn(RTSP_MSG_END_FLAG, -2); // 这就话就需要同步!
end;
end;

要改成:
private
public
aa: string;
CS: TCriticalSection; // 互斥对象
end;
procedure TFrmMain.IdTCPServerExecute(AThread: TIdPeerThread);
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
CS.Acquire();
try
aa := AThread.Connection.ReadLn(RTSP_MSG_END_FLAG, -2); // 这就话就需要同步!
finaly
CS.Release();
end;
end;
end;
 
这样做是很保险的,但是indy的多线程的优点也丧失殆尽!
为什么不在TIdPeerThread线程中直接加入变量呢?这样做就不需要考虑同步问题了,只是鄙人愚钝,不能实现,哪位好手有良策以图之?
 
对呀
开发INDY是,就需要将用到的变量都私有化和局部化,这样就避免了排队等候。
我的INDY项目就几乎没用到同步,互斥等。
想如果要得到INDY所有连接的属性,就要用到同步了,那也是没办法的事情(但是INDY本身的THREADLIST本身就实现同步了)
 
开发INDY是,就需要将用到的变量都私有化和局部化,这样就避免了排队等候
====================================================================
能不能来点demo代码?呵呵
 
没人仔细考虑过?
 
给我你的MAIL,发给你:)
 
谢谢!
neted@nbcpa.org.cn
 
请查收:)
 
没有啊[:(]
麻烦再重发一遍,谢谢!
以下地址也可以:
neted@cnnb.net
 
后退
顶部