2014-07-04 1 views
0

스레드 풀을 만들려고합니다. 몇 줄의 예제가 있지만 SyncObjs 라이브러리에서 TSemaphore를 사용합니다.Delphi TSemaphore 소스 코드

저는 Delphi 6를 사용하고 있으며 SyncObjs에는 TSemaphore가 포함되어 있지 않습니다. 나는 그물을 둘러 보았고 그것을위한 소스 코드를 찾을 수 없다.

TSemaphore가 포함 된 델파이 6에서 작동하는 라이브러리가 있습니까?

+0

'TSemaphore'는 Win32 세마포어 개체를 둘러싼 간단한 래퍼입니다. 쉽게 캡슐화 할 수있는 고유 한 클래스를 작성할 수 있습니다. MSDN 설명서부터 시작하십시오. –

+0

실제로 Win32 API에는 스레드 풀 구현도 포함되어 있습니다. 바퀴를 재발 명하기 전에 (또는 OmmniThread에서) 하나를 사용하고 싶을 수도 있습니다. (실수 풀기도합니다.) – Daniel

+0

@Daniel, Thread Pool API는 Vista 이후로 존재합니다. XP에 대한 지원이 사라지더라도 여전히 많은 기계가 실행되고 있습니다. – TLama

답변

6

TSemaphore 클래스는 Win32 세마포어 API를 둘러싼 간단한 래퍼입니다. 같은 스타일의 간단한 래퍼를 만드는 것은 매우 쉽습니다. 예 :

type 
    TSemaphore = class 
    private 
    FHandle: THandle; 
    public 
    constructor Create(AInitialCount, AMaximumCount: Integer); 
    destructor Destroy; override; 
    procedure Acquire; 
    function Release(AReleaseCount: Integer): Integer; overload; 
    procedure Release; overload; 
    end; 

constructor TSemaphore.Create(AInitialCount, AMaximumCount: Integer); 
begin 
    inherited Create; 
    FHandle := CreateSemaphore(nil, AInitialCount, AMaximumCount, nil); 
    Win32Check(FHandle <> 0); 
end; 

destructor TSemaphore.Destroy; 
begin 
    if FHandle <> 0 then 
    CloseHandle(FHandle); 
    inherited; 
end; 

procedure TSemaphore.Acquire; 
begin 
    Win32Check(WaitForSingleObject(FHandle, INFINITE) = WAIT_OBJECT_0); 
end; 

function TSemaphore.Release(AReleaseCount: Integer): Integer; 
begin 
    Win32Check(ReleaseSemaphore(FHandle, AReleaseCount, @Result)); 
end; 

procedure TSemaphore.Release; 
begin 
    Release(1); 
end; 

이것은 매우 간단합니다. 이것을 시작으로 당신이 원하는 모든 종소리와 호루라기를 추가 할 수 있어야합니다.

참고 :이 기능은 테스트하지 않았으므로 맹목적으로 이해하지 말고 복사하십시오.

+0

감사합니다, 데이비드, 시작하기 좋은 곳 같습니다. –