블로그는 나의 힘!
[ Programing ]/Server2012. 12. 4. 06:59

출저 : http://blog.daum.net/aswip/6297610

출저 : http://newly3.tistory.com/7

 

 

 

다음 내용은 윈도우 환경에서 EVENT 객체를 사용하는 방법에 대해서 설명하고 있습니다.

일반적으로 이벤트 객체는 서로 다른 쓰레드 환경에서 공유자원의 무결성을 효과적으로 제어하기 위해서

사용되어집니다. 물론 그 밖의 쓰임새도 있겠죠.

 

본 예제에서는 이벤트 객체를 시그널 된 상태일 때와 그렇지 않을 때를 비교해서 설명하고 있습니다.

내용이 어렵지 않으니, 실행해 보시면 금방 이해가 가실거라는 생각이 드네요.

 

 

 

#include <time.h>
#include <stdio.h>

#include <windows.h>

#define MY_WAIT_TIME        5000

void EventWithSignal()
{
    DWORD dwRet = 0;
    HANDLE hEvent = NULL;
    time_t tStart = time(0);

    hEvent = CreateEvent(NULL, TRUE, FALSE, "YourEventName");    
    
    printf("Event with signal\n");

    // 이벤트 객체를 signaled 상태로 만듬
    SetEvent(hEvent);

    printf("Sst event\n");

    
    // event가 발생 할 때 까지 5초 동안 대기
    dwRet = WaitForSingleObject(hEvent, MY_WAIT_TIME);

    if ( dwRet == WAIT_OBJECT_0 )
        printf("event is signaled.\n");

    CloseHandle(hEvent);
    printf("elapsed time %d sec.\n", time(0) - tStart);
    printf("\n");
}

void EventWithNonSignal()
{
    DWORD dwRet = 0;
    HANDLE hEvent = NULL;
    time_t tStart = time(0);
    hEvent = CreateEvent(NULL, TRUE, FALSE, "YourEventName");    
    
    printf("Event with non-signal\n");

    // 이벤트 객체를 non-signaled 상태로 만듬
    ResetEvent(hEvent);

    printf("Rest event\n");    


    // event가 발생 할 때 까지 5초 동안 대기
    dwRet = WaitForSingleObject(hEvent, MY_WAIT_TIME);

    if ( dwRet == WAIT_TIMEOUT )
        printf("event timeout..\n");

    CloseHandle(hEvent);
    printf("elapsed time %d sec.\n", time(0) - tStart);
    printf("\n");
}

int main(int argc, char **argv)
{   
    EventWithSignal();    
    EventWithNonSignal();
    return 0;
}

 

 

 

CreateEvent

: 이벤트를 생성. 생성시 이벤트를 non signal / signal 상태로 생성 가능하다.

(생성되지 않은 이벤트 생성/생성되어 있는거라면 HANDLE리턴)

 

OpenEvent

: 생성된 Event를 Open

(생성되지 않은 이벤트라면 invalid_handle같은 에러 리턴)

 

SetEvent

: 이벤트를 전송. non signal 상태를 signal 상태로 변환한다.

(wait하는 thread가 없어도 상태가 저장되어 wait하는 thread는 signal을 받을수 있다.)

 

PulseEvent

: 이벤트를 전송. 현재 대기하는 thread만 signal을 보내고 signal을 unset한다.

(auto일 경우 하나만, manual일 경우 전체)

 

ResetEvent

: 이벤트를 reset

(SetEvent에 의해 전송된 이벤트가 메뉴얼 reset설정되어 있는 경우 ResetEvent를 해야 함)

 

 

 

'[ Programing ] > Server' 카테고리의 다른 글

IOCP  (0) 2013.08.22
뮤텍스와 세마포어  (0) 2013.08.22
Shared memory  (0) 2010.07.23
메모리 락  (0) 2010.06.29
POSIX 정규 표현식  (0) 2010.06.29
Posted by Mister_Q