0

我创建一个线程

type 
  ss_thread = class;

  ss_thread = class(TThread)
  protected
    Fff_id : string;
    Fff_cmd : string;
    Fff_host : string;
    Fff_port : TIdPort;
    procedure Execute; override;
  public
    constructor Create(const ff_id, ff_cmd: string; ff_host: string; ff_port: TIdPort);
  end;

constructor ss_thread.Create(const ff_id, ff_cmd: string; ff_host: string; ff_port: TIdPort);
begin
  inherited Create(False);
  Fff_id   := ff_id;
  Fff_cmd  := ff_cmd;
  Fff_host := ff_host;
  Fff_port := ff_port;
end;

...
id := 123; // dynamic
...

nst_ss_thread.Create(id, cmd, host, port);

并做某事

procedure ss_thread.Execute;
var
  ws : TIdTCPClient;
  data : TIdBytes;
  i : integer;
  list : TList;
begin
      ws := TIdTCPClient.Create(nil);
      ws.Host := Fff_host;
      ws.Port := Fff_port;
....

我有主线程,它从其他源接收数据,我需要将所有数据转发到我的线程,我收到的 ID 是“ws”IdTCPClient。

如何获得我创建的所有线程的 IdTCPClients 列表?

谢谢

4

1 回答 1

1

将它们存储在线程列表中。

ClientList: TThreadList<TIdTCPClient>;

在创建任何客户端之前创建这些对象之一。

ClientList := TThreadList<TIdTCPClient>.Create;

每当您创建客户端时,添加它:

procedure ss_thread.Execute;
var
  List: TList<TIdTCPClient>;
....
ws := TIdTCPClient.Create(nil);
List := ClientList.LockList;
try
  List.Add(ws);
finally
  ClientList.UnlockList;
end;

每当您需要迭代客户端时,您可以这样做:

var
  List: TList<TIdTCPClient>;
  Client: TIdTCPClient;
....
List := ClientList.LockList;
try
  for Client in List do
    // do something with Client
finally
  ClientList.UnlockList;
end;

在线程的析构函数中,您还需要从列表中删除客户端。

于 2012-11-27T14:25:53.990 回答