1、INDY IDTCPSERVER是支持多线程的,可是如何才能有效的管理和使用它的多线程呢?
比如如何获取INDY IDTCPSERVER当前有多少线程,每个线程的HANDLE是多少?
(IDTCPSERVER.THREADS中好像没有COUNT这个属性)
2、我现在想实现这么一个功能:有多客户主动连接IDTCPSERVER,连接成功后我会在LISTVIEW中显示这个ATHREAD的句柄,现在要求点击LISTVIEW中的ITEM后如何同IDTCPSERVER中的ATHREAD一一对应起来并进行操作呢?请给一个例子好吗?

解决方案 »

  1.   

    第一个问题。考虑到线程安全问题,在访问的 Threads 时,必须加锁的,你可以通过 IdTcpServer.Threads.LockList.Count 方式访问到 Thread 的数量,不过必须及时解锁。这是一个官方 TThreadList 的例子:  with MyThreadList.LockList do
      try
        for X := 0 to Count-1 do
          Something(Items[X]);
      finally
        MyThreadList.UnlockList;
      end;这个 TList 对象的每一个 Item 就是一个 TIdPeerThread 对象,可以采用类型强制转换的方式得到:如 TIdPeerThread(Items[Index]) 得到一个 TIdPeerThread 对象。对于第二个问题,可以让每个 TListView 的 Item 的 Data 属性指向每一个 TIdPeerThread 对象(一般是在 Connect 的事件加入,Disconnect 删除的),这样就可以关联起来。
    下面是简单示例:
    // 构成 TListView 的列表
    procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
    var
      Item:  TListItem;
    begin
      Item := ListView1.Items.Add;
      Item.Caption := IntToStr(AThread.ThreadID);
      Item.Data := AThread;
    end;
    // 通过 TListView 获取每个 TIdPeerThread 对象
    procedure TForm1.Button4Click(Sender: TObject);
    begin
      if ListView1.Selected <> nil then
        TIdPeerThread(ListView1.Selected.Data).Connection.WriteLn(ListView1.Selected.Caption);
    end;