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中StringGrid控件问题请教,求指导!
- 自定义数据类型的作用大吗?
- 求实现类似eBook 软件效果的算法!!!
- 各位高手,我想问问在delphi中如何搜索已知文件名的文件,谢谢!
- 线程控制的问题
- 能不能把表里的数据输出到Excel.???急,在线等待!
- 怎樣讓報表的標題欄只顯示一次而不是每頁都顯示一次?
- 如何给listbox加水平滚动条?
- 在query中用sql语句,除了加减乘除和sum,avg,count等函数外,有无办法使用sqr,sqrt,乘方等运算。(实在没有时间去编解析字符串的工作),请
- 好烦得问题
- 如何在imag1.canvas清除图形中的文字,并且在图形移动过程中,不清除其它图形中的文字!来者有分!2
- 怎样手动设定StringGrid中每一列的宽度?
ClientList.Delete(ClientList.Items.Count-1);这样不行吗?
你的问题估计是你的Client字段或变量造成的procedure Del(myThread : TThread);
var
i, Count_1 : integer;
Client: TSimpleClient; //不要用全局的,用临时变量
begin
EnterCriticalSection(myCs);
try
Client := TSimpleClient(myThread.Data);
I := Client.ListLink;
Count_1 := ClientList.Count-1; if I <> Count_1 then
begin
// 把列表中最后一个结点提前.
ClientList.Items[i] := ClientList.Items[Count_1]; // 修改这个结点的ListLink为结点在ClientList的index.
TSimpleClient(ClientList.Items[i]).ListLink := i;
end; // 删除最后一个结点.
ClientList.Delete(Count_1);
Client.Destroy();
myThread.Data := nil;
finally
LeaveCriticalSection(myCs);
end;
end;
按照你原来的代码,顺序做三个操作:
1.Client := Add(ThreadA); //ClientA ListLink = 0; Client = ClientA
2.Client := Add(ThreadB); //ClientB ListLink = 1; Client = ClientB
3.Del(ThreadA);
本应Free ClientA,可是你Del的最后那段代码却是,
if Client <> nil then
begin
Client.Free;
Client := nil;
myThread.Data := nil;
end;
因为这时Client = ClientB,所以实际上Free的是ClientB
所以你应该Free的是myThread.Data所指向的Client,而不要Free全局变量那个Client