var
  myCs : TRTLCriticalSection;//临界区//用户类
type
  TSimpleClient = class
    ListLink : integer;
    Thread   : pointer;
end;procedure TfrmServer.FormCreate(Sender: TObject);
begin
  // 创建用户列表.
  ClientList := TList.Create;  // 创建用户对象.
  Client := TSimpleClient.Create;  InitalizeCriticalSection(myCs);  
end;// 将用户添加进ClientList中
procedure Add(myThread : TThread)
begin
  EnterCriticalSection(myCs);  try
    Client.ListLink := ClientList.Count;    Client.Thread := myThread;    // 将用户资料放入线程的Data中.
    myThread.Data := Client;    // 将用户加入用户列表中.
    ClientList.Add(Client);
  finally
    LeaveCriticalSection(myCs);
end;//将用户从ClientList中删除 
procedure Del(myThread : TThread);
var
  i : integer;
begin
  EnterCriticalSection(myCs);
  try   
    i := TSimpleClient(myThread.Data).ListLink;    // 把列表中最后一个结点提前.
    ClientList.Items[i] := ClientList.Items[ClientList.Count - 1];    // 修改这个结点的ListLink为结点在ClientList的index.
    TSimpleClient(ClientList.Items[i]).ListLink := i;    // 删除最后一个结点.
    ClientList.Delete(ClientList.Count - 1);
    
  finally
    if Client <> nil then
    begin
      Client.Free;
      Client := nil;
      myThread.Data := nil;
    end;
    LeaveCriticalSection(myCs);
end;为什么我TList中的结点有时候删除不完全呢?当结点少的时候删除很正常,结点一多就出问题了,总会有少数结点未能够正常删除.
原来用TList.Delete(),也不能完全删除TList中的所有结点.
到底是什么原因导致这种情况呢?该怎么解决呢?谢谢.

解决方案 »

  1.   

    Client是全局对象,你删除用户以后还能怎加用户么?
    TList中保存的都是同一个Client的指针,你删除一个用户后Client就不能使用了。
      

  2.   

    支持feelike,你应该用一个指向TSimpleClient的指针pClient,每次添加用户时就:
      new(pClient);
      pClient:=TSimpleClient.Create;
      ClientList.add(pClient);
    这样才能保证每个Client有自己的内存。
    删除时就要:
      pClient:=ClientList.items[i];
      pClient^.destroy;//调用析构函数
      dispose(pClient);//释放分配给Client的内存 
      ClientList.items[i]:=ClientList.items[ClientList.count-1];
      TSimpleClient(ClientList.Items[i]).ListLink := i;
      ClientList.delete(ClientList.count-1);
    至于delete不能完全删除,是什么意思,在哪里出的错啊?  
      

  3.   

    我现在是这样的,每次添加用户的时候都是:Client := TSimpleClient.Create.
    这样可以吗?
      

  4.   

    不行,既然只声明了一个变量:Client,那么就只有一块内存被分配出来,不管Create多少次。
      

  5.   

    因为代码不全,具体解决方法不好说。但是肯定是你创建并插到list的时候,插进去的只是指针,当你在这边,或者另一个地方删除了那条数据的时候,已经把那块内存释放了,所以你这里显示的数据对应的是没有内存地址的,就报错了!解决的方法是你插入的时候,不要把原来的那个对象插进去,而是在创建一个对象,从原来的对象复制到这个对象,这样这个对象就有了自己的内存地址,插入的时候插这个新的对象,删除就不会有问题了。