2

マルチスレッドの外部アプリケーションがあり、このアプリはカスタム dll を使用してそのスレッドからいくつかのことを行っています。
このdllには、データを読み書きする2つの関数がありますTList
それらのスレッドがそのリストを自由に読み取れるようにする必要がありますが、一度に書き込むことができるのは 1 つだけで、残りは書き込むまで待機する必要があります。

私の質問:
- BDS 2006 にTListは TMREWSync 機能を備えたコンポーネントがありますか、または -
私のアプリで使用できる無料のサードパーティ コンポーネントを知っているかもしれません。
TList

編集TThreadList.LockList:私はそのリストに書き込むためだけに何かが必要です。

助けてくれてありがとう。

4

1 に答える 1

2

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

于 2013-03-04T12:25:21.560 に答える