Delphi2006 - 是否有TList与TMultiReadExclusiveWriteSynchronizer?

时间:2013-03-04 10:37:50

标签: multithreading delphi delphi-2006 synchronisation tlist

我有多线程的外部应用程序,这个应用程序正在使用我的自定义dll从该线程做一些事情。
在这个dll中,我有2个函数可以读取并向TList写入一些数据 我需要那些线程可以自由读取的列表,但一次只能写一个,其余的必须等待他们的时间写。

我的问题:
  - BDS 2006中是否有TList组件具有TMREWSync功能或
  - 也许您知道我可以在我的应用程序中使用的任何免费的第三方组件   - 也许你有一些自定义TList代码可以执行上面提到的这样的事情。

修改: 我需要类似TThreadList.LockList之类的内容,但仅限于写入该列表。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

以与TMultiReadExclusiveWriteSynchronizer相同的方式组合TListTThreadList非常简单。如果您已经知道这些类如何工作,那么您将能够遵循以下代码。

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的方式添加一些花里胡哨的东西。