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中的所有结点.
到底是什么原因导致这种情况呢?该怎么解决呢?谢谢.
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中的所有结点.
到底是什么原因导致这种情况呢?该怎么解决呢?谢谢.
解决方案 »
- 拷贝文件夹出错!!!!!!!!!!!!!!
- delphi提问
- 怪怪怪!!事务处理的问题,出现一次出错后再用事务就出问题了
- 从access中取出流形式的.jpg图片在quickrep中用qrdbimage显示,大家帮我看看为什么没有图片显示出来???
- 在TQuery中进行查询比较的问题??高手指教,在线给分!
- 一个有关HTTP协议的底层技术性问题(高分相送)
- ★★★★★菜鸟提问: 如何动态的创建TTabSheet,并且该TabSheet能够预先在design time先设计好?
- 问一个简单的函数使用
- 菜鸟问题,table中如何用游标指向的行对变量赋值
- 怎样判断DBMemo的的内容是否为空?
- 着急,为什么我用fbarcode打印出来的条码能识别,存成图片就识别不了呢?
- 没分,祝大家身体健康(下一个星期后一定给)
TList中保存的都是同一个Client的指针,你删除一个用户后Client就不能使用了。
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不能完全删除,是什么意思,在哪里出的错啊?
这样可以吗?