1 sockets delphi pointers threadpool
我有一个TThreadList
指向我的服务器创建的对象的所有指针.服务器有一个线程池,用于将数据发送到该线程列表中的所有客户端.它会锁定列表,然后在用户断开连接后释放列表,删除对象和引用指针.
问题是:使用不知道套接字何时断开连接和删除的线程池,因此当池工作时,它将从线程列表中的选定指针AV上以某种方式已被删除.
例如,池的Execute
方法:
try
with userlist.LockList do
begin
for i := Count - 1 downto 0 do
begin
if i >= 0 then
begin
p := TClient(items[i]);
//problem here p gets deleted so it raises items[i]
//have an invalid pointer to memory
if p <> nil then
if p.sockethex <> nil then
begin
sendtexthexpool(p.sockethex, msgprimit+ '|'); //here AV cause P was deleted
end;
end;
end;
end;
finally
userlist.UnlockList;
end;
end;
Run Code Online (Sandbox Code Playgroud)
如果你只拥有一个指针,那么你无法判断它是否已被释放.您必须让您的程序跟踪这些信息.
即使你能检测到一个陈旧的指针,你也做不到,它对你没有帮助.你还会参加比赛.
在您的摘录中,您有一个主题列表.只要在列表被锁定时对指针进行所有访问,那么您将没有任何问题.据推测,你没有锁定列表就释放了对象.解决这个问题,一切都应该好.