Delphi: TThreadList иногда блокирует программу - PullRequest
0 голосов
/ 17 декабря 2011

Иногда эта функция блокирует мою программу, и она зависает, пока я не закрою ее.Что здесь не так?

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 ]

5 голосов
/ 17 декабря 2011

Вам необходимо вызвать 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;
0 голосов
/ 17 декабря 2011

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

...