首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2012-09-17 
使用IndyTcp多线程通讯设置一个主端和若干个客户端 在主端上显示在线的客户端的个数使用的IndyTcpServer和

使用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; 

热点排行