-3

この関数がプログラムをロックし、閉じるまでフリーズすることがあります。ここで何が問題になっていますか?

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;
4

2 に答える 2

5

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;
于 2011-12-17T05:43:29.243 に答える
-1

間違った方向のforループカウント。メンバーを削除するときは、カウントアップではなくカウントダウンする必要があります。

于 2011-12-17T04:16:26.983 に答える