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