Delphi: TThreadList иногда блокирует программу
Иногда эта функция блокирует мою программу, и она зависает, пока я не закрою ее. Что здесь не так?
function del_from_list(id:string):boolean;
var i : integer;
begin
Result := True;
try
with global_list.LockList do
begin
for i:=0 to Count-1 do
begin
if Tthread_list(Items[i]).id = id then
begin
Delete(i);
break;
end;
end;
end;
finally
global_list.UnlockList;
end;
end;
класс
Tthread_list = class
public
id : string;
constructor Create(const id: string);
end;
Я добавляю в список вот так:
global_list.Add(Tthread_list.Create('xxx'));
глобальный список является глобальной переменной
var global_list : TThreadList = nil;
2 ответа
Решение
Вам нужно позвонить LockList()
за пределами try
блок вместо него, например:
function del_from_list(const id: string): boolean;
var
List: TList;
i : integer;
begin
Result := False;
List := global_list.LockList;
try
with List do
begin
for i :=0 to Count-1 do
begin
if Tthread_list(Items[i]).id = id then
begin
Delete(i);
Result := True;
break;
end;
end;
end;
finally
global_list.UnlockList;
end;
end;
Цикл считается в неправильном направлении. Удаляя участников, вы ДОЛЖНЫ считать, а не увеличивать.