再线等,List(100分)

  • 主题发起人 主题发起人 wuchunhua
  • 开始时间 开始时间
W

wuchunhua

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个TList对象,
有插入,删除操作,在插入和删除都采用临界的方法
同时有一个线程一直在判断TList的每个对象的状态,比如对象有一个属性active 如果active = false的时候 要删除这个对象 在线程中是用循环
while not terminated do
for i:= FList.count-1 downto 0 do
begin
if Flist.active = false then
FList.delete ;
end;
当很多TList对象同时把状态变为False,线程会出项indexOf() out的错误 有没有好的办法解决这个问题
 
不用FList.delete ;
FList:=nil;
或者是
var
i,j:integer;
begin
j:=FList.count-1;
for i:= 0 to j do
begin
if Flist.active = false then
begin
FList.delete ;
dec(j);
end;
end;
end;
 
线程中间访问 FList 也需要临界
 
用消息控制你上面的代码
 
消息的方法的确是不错,我把TList放到一个TClass(TObject)的类中,有没有办法把一个消息封装成这个类的事件 有没有 message of TObject的用法呀?
 
你可以用Indy中的TIdThreadSafeList,它有个Lock/Unlock方法,专门解决你这种问题的。
需要uses IdThreadSafe
 
Classes 单元里有现成的 TThreadList 类,查帮助……
 
线程会出现indexOf() out的错误 -->> 问题出在你线程中删除的时候没有进临界区,对List操作没有同步。
另外:FList.delete 还要考虑对象是否正确释放了,否则会有内存泄漏。
 
多人接受答案了。
 
后退
顶部