제프리 릭터의 Programming Applications for Microsoft Windows에 담긴 내용입니다.

대기가능 타이머(waitable timer) 커널 객체 : 특정 시간에 혹은 일정 간격으로 그 자신에게 신호를 보낸다. 주로 특정 시간에 어떤 연산을 수행해야할 때에 사용되더라..

대기가능 타이머는 언제나 비신호 상태로 생성되기 때문에, 신호 상태로 만들려면 반드시 SetWaitableTimer()를 호출하여, 타이머가 신호 상태로 변경될 시점을 알려야 하더라..

(SetTimer()로 설정하는) 사용자 타이머와 대기가능 타이머의 비교
사용자 타이머 : 추가적인 UI 인프라를 요구하기 때문에, 리소스 사용량이 많다. 또한 사용자 타이머가 발생시키는 WM_TIMER는 가장 우선순위가 낮은 메시지기 때문에 울림 시간이 정확하지 않은 경우가 많다. 하지만 UI관련 타이머 이벤트를 수행한다면 사용하기가 쉽다. (대기가능 타이머는 커널 객체뿐만 아니라 메시지도 기다려야 한다. -> MsgWaitForMultipleObjects() 이용)
대기가능 타이머 : 커널 객체이기 때문에, 여러 쓰래드에서 공유될 수 있으며, 안전하고 정확하다.
HANDLE CreateWaitableTimer (
    PSECURITY_ATTRIBUTES psa,
    BOOL fManualReset,
    PCTSTR pszName );

fManualReset : 수동 리셋(TRUE)인지, 자동 리셋(FALSE)인지의 여부
                      이벤트에서의 수동 리셋, 자동 리셋 기능과 동일

HANDLE OpenWaitableTimer (
    DWORD dwDisiredAccess,
    BOOL bInheritHandle,
    PCTSTR pszName );

BOOL SetWaitableTimer (
    HANDLE hTimer,
    const LARGE_INTEGER *pDueTime,
    LONG lPeriod,
    PTIMERAPCROUTINE pfnCompletionRoutine,
    PVOID pvArgToCompletionRoutine,
    BOOL fResume );

pDueTime : 타이머가 처음으로 울릴 시점
lPeriod : 타이머가 울릴 시간 간격
fResume : 잠시 대기(suspend)에서 재개(resume)을 지원하는 컴퓨터에서 쓰임. 보통은 FALSE로 많이 놓는다.
pfnCompletionRoutine, pvArgToCompletionRoutine :
타이머가 신호 상태로 왔을 때에 실행될 프로시저의 함수 포인터와 매개변수. 타이머와 함께 APC(Asynchronous Procedure Call)을 사용할 경우 이용한다..

Posted by 어쨌건간에
제프리 릭터의 Programming Applications for Microsoft Windows에 담긴 내용입니다.

이벤트(Event) 커널 객체 : 커널 객체 중 가장 원시적인 객체. 사용 카운트(usage count), 자동 리셋(auto reset)-수동 리셋(manual reset) 상태 여부를 구분하는 불 값, 신호-비신호 상태 여부를 구분하는 불 값으로 구성되더라..
수동 리셋 이벤트 : 신호 상태가 되었을 때, 이벤트를 기다리던 모든 쓰래드가 스케쥴 가능 상태가 되더라..
자동 리셋 이벤트 : 신호 상태가 되었을 때, 이벤트를 기다리던 쓰래드 중 하나만 스케쥴 가능 상태가 되더라..

용도 : 쓰래드 하나가 초기 작업을 한 이후에 다른 쓰래드(들)로 하여금 나머지 작업을 하도록 신호를 보낼 경우에 사용하더라...

//이벤트 생성
HANDLE CreateEvent (
    PSECURITY_ATTRIBUTES psa,
    BOOL fManualReset,
    BOOL fInitialState,
    PCTSTR pszName);

fManualReset : 수동 리셋(TRUE)인지, 자동 리셋(FALSE)인지의 여부
fInitialState : 신호상태(TRUE)로, 비신호상태(FALSE)로 초기화되는지의 여부

HANDLE OpenEvent (
    DWORD fdwAccess,
    BOOL fInherit,
    PCTSTR pszName);

//이벤트를 신호 상태로 변경시킨다.
BOOL SetEvent ( HANDLE hEvent );

//이벤트를 비신호 상태로 변경시킨다.
BOOL ResetEvent ( HANDLE hEvent );

//SetEvent를 호출했다가 바로 ResetEvent를 호출한 것과 동일한 효과..
BOOL PulseEvent ( HANDLE hEvent );
Posted by 어쨌건간에
TAG event, Richter