读书人

使用IndyTcp多线程通讯解决方法

发布时间: 2012-09-17 12:06:51 作者: rapoo

使用IndyTcp多线程通讯
设置一个主端和若干个客户端 在主端上显示在线的客户端的个数
使用的IndyTcpServer和IdThreadMgrDefault
currentno表示个数
连接事件如下,不知道写的对不对,其实我是菜鸟,不怎么了解这个东西的运用。

procedure TServerMain.serverConnect(AThread: TIdPeerThread);
var
NewClientThread : Pointer;
begin
athread.Data := TObject(NewClientThread);
try
Clients.LockList.Add(NewClientThread);

finally
Clients.UnlockList;
end;
currentno := currentno + 1;
edtno.Text := inttostr(currentno);
end;


断开事件如下
procedure TServerMain.serverDisconnect(AThread: TIdPeerThread);
var
ActClientThread : Pointer;
begin
ActClientThread := Pointer(athread.Data);
try
Clients.LockList.Remove(ActClientThread);

finally
Clients.UnlockList;
end;
FreeMem(ActClientThread);
AThread.Data := nil;
currentno := currentno - 1;
edtno.Text := inttostr(currentno);
end;

客户端的界面打开就connect关闭就disconnect
先把服务端打开,客户端连接 显示正常。但是关闭窗口后却个数显示不正常,没有减1.
后来发现,没有执行服务端的serverdisconnect事件,所以个数一直没有减少,关闭服务端的时候提示异常
Terminate Thread Timeout
请问各位,这是为什么呢!

[解决办法]
看了下INDY的源代码, 直接取他的连接数就行,他里边用了个ThreadList 来保存连接的
下边我放在定时器里的代码

Delphi(Pascal) code
procedure TForm1.Timer1Timer(Sender: TObject);var  Temp: TList;begin  Memo1.Lines.Add('当前连接数:' + IntToStr(TList(IdTCPServer1.Threads.lockList).Count));//IdTCPServer1.Threads.  IdTCPServer1.Threads.UnlockList;  // 这步不能少, 要不别人都无法操作了end; 

读书人网 >.NET

热点推荐