2013-03-04 13 views
2

나는 멀티 스레드 된이 응용 프로그램은 내 사용자 지정 dll 해당 스레드에서 일부 작업을 수행 할 수 있습니다.
이 dll에는 읽고 쓸 데이터가 TList 인 2 개의 함수가 있습니다.
해당 목록에서 해당 목록을 자유롭게 읽을 수 있어야하지만 한 번에 하나만 쓸 수 있습니다. 나머지는 작성 시간을 기다려야합니다.Delphi2006 - TMultiReadExclusiveWriteSynchronizer가있는 TList가 있습니까?

내 질문 :
- 어쩌면 당신은 내가 내 응용 프로그램에서 사용하거나
수있는 무료 타사 구성 요소를 알고 - - BDS 2006 TMREWSync 기능 또는
을 가지고 TList 구성 요소가 어쩌면 당신은 몇 가지가 위에서 언급 한 것과 같은 일을 할 수있는 코드 TList을 사용자 정의했습니다.

편집 : TThreadList.LockList과 같은 것이 필요하지만 그 목록에 쓰기 위해서만 필요합니다.

도움 주셔서 감사합니다.

+0

가능한 [Delphi MREW 구현은 독자에게 호의적입니까?] (http://stackoverflow.com/questions/1742915/delphi-mrew-implementation-that-favors-readers) –

+0

당신이 이해할 수 없다, 나는 TList가 필요하다. MREW 기능을 가진 사용자는 동일한 질문이 아닙니다. TThreadList가 있지만 잠금을 모두 해제하면 잠금이 제거 될 때까지 읽기가 불가능합니다. – NevTon

+2

'TMultiReadExclusiveWriteSynchronizer'는 싱크로 객체입니다. 연결된 컨테이너가 없습니다. 너 혼자 그렇게해야 해. 그렇게하는 것은 매우 쉽습니다. 시도해 봤어? –

답변

2

TThreadList과 같은 방식으로 TMultiReadExclusiveWriteSynchronizerTList을 조합하면됩니다. 이 수업의 작동 방식을 이미 알고 있다면 아래 코드를 따라갈 수 있습니다.

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의 방식으로 더 많은 종소리와 휘파람을 더할 수 있습니다.

+0

고마워,하지만 한 가지 추가 질문이 있습니다. 솔루션을 사용하여 이미 잠긴 상태에서 쓰기 위해 잠글 수 있습니까? – NevTon

+0

'TMultiReadExclusiveWriteSynchronizer'가 허용 할 수 있습니다. –

+0

가설 상황은 다음과 같습니다 :'List.LockListRead 시도해보십시오 ... 할 일 ... ...'List.LockListWrite.Items [x] : = Nil; List.UnlockListWrite;'... do something ...'마지막으로 List.UnlockListRead; 끝; 내가 할 수 있을까? – NevTon