Delphi2006 - Есть ли TList с TMultiReadExclusiveWriteSynchronizer?

У меня есть внешнее приложение, которое является многопоточным, и это приложение использует мой пользовательский dll, чтобы делать некоторые вещи из этих потоков.
В этой DLL у меня есть 2 функции, которые читают и записывают некоторые данные в TList,
Мне нужно, чтобы этот список свободно читался этими потоками, но только один может писать одновременно, остальные должны ждать, пока их время будет писать.

Мой вопрос:
- есть ли в BDS 2006 TList компонент, который имеет возможность TMREWSync или
- может быть, вы знаете какой-либо бесплатный сторонний компонент, который я могу использовать в своем приложении или
- может быть, у вас есть некоторые настроенные TList код, который может делать такие вещи, как указано выше.

Изменить: мне нужно что-то вроде TThreadList.LockList но только для записи в этот список.

Спасибо за любую помощь.

1 ответ

Решение

Достаточно просто собрать TMultiReadExclusiveWriteSynchronizer а также TList так же, как TThreadList, Если вы уже знаете, как работают эти классы, вы сможете следовать приведенному ниже коду.

type
  TReadOnlyList = class
  private
    FList: TList;
    function GetCount: Integer;
    function GetItem(Index: Integer): Pointer;
  public
    constructor Create(List: TList);
    property Count: Integer read GetCount;
    property Items[Index: Integer]: Pointer read GetItem;
  end;

  TMREWList = class
  private
    FList: TList;
    FReadOnlyList: TReadOnlyList;
    FLock: TMultiReadExclusiveWriteSynchronizer;
  public
    constructor Create;
    destructor Destroy; override;
    function LockListWrite: TList;
    procedure UnlockListWrite;
    function LockListRead: TReadOnlyList;
    procedure UnlockListRead;
  end;

{ TReadOnlyList }

constructor TReadOnlyList.Create(List: TList);
begin
  inherited Create;
  FList := List;
end;

function TReadOnlyList.GetCount: Integer;
begin
  Result := FList.Count;
end;

function TReadOnlyList.GetItem(Index: Integer): Pointer;
begin
  Result := FList[Index];
end;

{ TMREWList }

constructor TMREWList.Create;
begin
  inherited;
  FList := TList.Create;
  FReadOnlyList := TReadOnlyList.Create(FList);
  FLock := TMultiReadExclusiveWriteSynchronizer.Create;
end;

destructor TMREWList.Destroy;
begin
  FLock.Free;
  FReadOnlyList.Free;
  FList.Free;
  inherited;
end;

function TMREWList.LockListWrite: TList;
begin
  FLock.BeginWrite;
  Result := FList;
end;

procedure TMREWList.UnlockListWrite;
begin
  FLock.EndWrite;
end;

function TMREWList.LockListRead: TReadOnlyList;
begin
  FLock.BeginRead;
  Result := FReadOnlyList;
end;

procedure TMREWList.UnlockListRead;
begin
  FLock.EndRead;
end;

Это самая простая возможная реализация. Если вы хотите, вы можете добавить еще несколько наворотов в виде TThreadList,

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