使用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 来保存连接的
下边我放在定时器里的代码
procedure TForm1.Timer1Timer(Sender: TObject);var Temp: TList;begin Memo1.Lines.Add('当前连接数:' + IntToStr(TList(IdTCPServer1.Threads.lockList).Count));//IdTCPServer1.Threads. IdTCPServer1.Threads.UnlockList; // 这步不能少, 要不别人都无法操作了end;