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;

Цикл считается в неправильном направлении. Удаляя участников, вы ДОЛЖНЫ считать, а не увеличивать.

Другие вопросы по тегам