SW 개발

[win32API] CreateEvent() 사용

. . . 2011. 4. 21. 11:28
반응형
  • 기타사항 : 틀린사항은 댓글로 수정바랍니다.
  • MSDN : http://msdn.microsoft.com/en-us/library/ms682396(VS.85).aspx

CreateEvent()

This function creates a named or an unnamed event object.

HANDLE CreateEvent(  
     LPSECURITY_ATTRIBUTES lpEventAttributes, 
     BOOL bManualReset, 
     BOOL bInitialState, 
     LPTSTR lpName );

Parameters

lpEventAttributes

[in] Ignored. Must be NULL.

bManualReset

  • 수동리셋 되거나 자동리셋되는 이벤트 오브젝트를 생성한다.
  • 만약 TRUE라면 ResetEvent()를 이용하여 수동적으로 nonsignal 상태로 만들어줘야한다.
  • 만약 FALSE라면 스레드가 release 될때 시스템이 자동적으로 nonsignal 상태로 만든다.

bInitialState

  • 이벤트 오브젝트의 초기상태를 설정한다.
  • TRUE라면 signaled 상태로 시작
  • FALSE라면 nonsignaled 상태로 시작.

comment by xeno)

  • CreateEvent(NULL,FALSE,FALSE,NULL); 이와 같이 FALSE로 생성하면 WaitForSingleObject() 에서 SetEvent 한번에 한번씩 풀리지만..
  • CreateEvent(NULL,TRUE,FALSE,NULL); 이와같이 TRUE로 생성하면 WaitForSingleObject() 에서 SetEvent 한번에 무한정 계속 풀린다;;

lpName

  • 해당 이벤트 의 이름을 정해줄 문자포인터(null-terminated)를 넘겨준다.
  • 이름문자열의 최대 길이는 MAX_PATH 만큼의 character 를 갖는다. 이름은 path-separator인 ()문자를 제외해야한다, 이름은 주의깊기 지어야한다;; 만약 이름이 중복된 이벤트가 존재한다면 bManualReset and bInitialState 는 무시된다. 왜냐면 이미 프로세스가 생성될때 세팅됐기 때문이다.
  • NULL 값을 주면 이름없이 만든다. 만약 이름이 semaphore, mutext, file-mapping object와 같다면 fail를 리턴할것이다. GetLastError로 확인하면 ERROR_INVALID_HAND 를 리턴한다. 왜냐하면 같은 name space를 공유하기때문에 오류를 발생시킨다.

Return Value

  • A handle to the event object indicates success.
  • 만약 해당 함수가 호출되기전에 named event object 가 존재하면 GetLastError에서 ERROR_ALREADY_EXISTS를 반환하고 기존에 존재하던 object를 반환할것이다.
  • NULL 은 실패시에 리턴.

확장된 정보를 얻기위해 GetLastError() 를 사용하라.

Remarks

핸들이 CreateEvent 에서 EVENT_ALL_ACCESS를 리턴하면 어떤 함수에서 요구되는 event object를 사용 되는 새로운 object를 접근할수다. (뭔말인지;; 해석불가;;)

쓰래드를 호출한 프로세스는 event-object를 wait 기능으로 사용할수도 있다. 해당 object의 상태가 signaled 될때까지 single-ojbect 는 함수가 리턴할때까지 기다린다. . (뭔말??;;)

muliple-ojbect 기다리는 함수는 각각이 리턴되는 것을 설계할수도 있다. signaled 된 특별한 object를 기다리는 함수가 리턴할때 기다리는 스레드는 종료루틴을 실행한다.

event object의 상태는 bInitialState 파라미터를 이용한다. SetEvent() 는 event object의 상태를 signaled 로 set 시킨다. ResetEvent() 함수는 event object를 nonsignaled 로 할때 사용한다. 매뉴얼 리셋으로 설정된 event object 가 sinaled 일때 ResetEvent() 로 nonsignaled 로 해주기 까지 signaled 상태로 남아있다. 몇개의 쓰래드 혹은 각각이 event object가 줄줄이 이어져 있는 쓰래드는 object의 상태가 signaled 되어있는 동안 종료할수있다. (뭔말이지?? 몰겟음 ㅡㅡ; 해석능력부족)

자동 리셋으로 설정된 event object 일때 signaled 로 남아있다. 하나의 wating 스래드가 종료될때까지 signaled 된 시스템은 자동적으로 nonsignaled 로 리셋된다. 기다리는 쓰래드가 없을때 event object의 상태는 signaled 로 남아있다.

다중 프로세스는 같은 ovent object 핸들을 갖을수있다, interprocess 동기화로 사용될수있다. object-sharing 메카니즘에 따르면 은 가능하다. CreateEvent() 로 생성하여 event-object를 하나의 프로세로 설계될수있다. ????

CloseHandle은 해당 핸들을 닫는다. 시스템은 프로세스가 종료될때 자동적으로 닫는다. event object는 마지막 핸들이 close 될때 파괴된다.

Requirements

OS Versions: Windows CE 1.0 and later. Header: Winbase.h. Link Library: Coredll.lib, Nk.lib.

반응형