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
,