wince.egloos.com

wince 5.0 삽질금지

포토로그 마이가든





이벤트기반 동기화

HANDLE CreateEvent(
    LPSECURITY_ATTRIBUTES lpEventAttributes,
    BOOL bMaualReset,
    BOOL bInitialState,
    LPCSTR lpName
);

1. 자식프로세스에게 상속할때
2. TRUE= 수동리셋 FALSE=자동리셋
3. 이벤트 오브젝트 초기화여부 TRUE=Signaled FALSE=Non-Signaled
4. 이벤트오브젝트 이름


쓰레드나 프로세스의 커널오브젝트인경우 초기에는 Non-Signaled 상태로 생성되었다가 스레드나 프로세스가 종료시 자동으로
Signaled 상태로 변경된다.
 
허나 이벤트 오브젝트는 자동으로 변경되지 않는다.따라서 함수호출을 통해 직접 이벤트오브젝트를 Signaled 상태로 변경해야한다

즉 CreateEvent의 두번째 인자값을 본다면 수동 자동 리셋모드인데 수동으로 할경우 해당 프로세스나 스레드가 빠져나오면

커널오브젝트 상태를 자동으로 변경(Signaled)해주냐 안변경해주냐를 결정한다.

수동인경우에는

직접 함수를 호출해야한다

ResetEvent(hHandle); : 커널오브젝트상태를 Non-Signaled 상태로 변경

SetEvent(hHandle); 커널오브젝트상태를 Signaled 상태로 변경

뮤텍스 기반 동기화 시스템프로그래밍

CreateMutex(
    LPSECURITY_ATTRIBUTES lpMutexAttributes,
    BOOL    bInitialOwner,
    LPCTSTR lpName
);

1.뮤텍스도 역시 커널오브젝트이다. 핸들상속여부결정
2. TRUE : 뮤텍스를 생성하는 스레드가 먼저 기회 FALSE== 먼저차지하는자가 임자
3.뮤텍스 이름

뮤텍스는 누군가의해 획득되면 Signaled 상태에 놓인다.

즉 크리티컬센션영역에서 나오면 다음 스레드가 들어오게 하기위해

ReleaseMutex( &hMutex);
를 선언해줘야 뮤텍스 커널오브젝트 상태가 바뀌게된다.

그리고 뮤텍스도 커널오브젝트이므로 CloseHandle함수를 호출하여 UsageCount를 0으로 만들어 없애는것도 잊지말자.

Critical Section 동기화 시스템프로그래밍

코드의 한블록을 들어가기위한 열쇠같은 녀석!

크리티컬섹션오브젝트는 자료형이 CRITICAL_SECTION 변수를 말한다
.


CRITICAL_SECTION gCriticalSection ;

이게 선언한 예시다.

선언후 반드시 초기화를 해야 사용가능상태가 된다.

InitializeCriticalSection(&gCriticalSection); //초기화


그리고 크리티컬섹션에 들어갈때 사용하는 열쇠사용법이다.

EnterCriticalSection(&gCriticalSection);

나올때 사용하는 열쇠

LeaveCriticalSection(&gCriticalSection);

보면 주소값을 가지고 인자값을 전달하는것을 볼 수있다.

주로 스레드동기화에 사용되며 특정 전역함수나 같이 공유하는 코드블럭을 처리시 사용된다.
  
그리고 크리티컬섹션도 역시 오브젝트이므로 할당된 리소스들이 존재하기때문에 반환해줘야한다.

DeleteCriticalSection(&CriticalSection);


커널 오브젝트 시스템프로그래밍

커널을 관리하는 중요한 정보를 담아둔 데이터블록 - 커널오브젝트

아 무슨말인지 모르겠따 추상적인듯..싶으니

즉 프로세스를 생성하면 윈도우에서 만들어지는게 커널오브젝트이다.

즉 프로세스의 상태 정보를 가지고있는 구조체이다! 아직도 모르겠다면

CreateProcess 호출->OS->커널오브젝트생성(프로젝트관리구조체에 의해서)->프로세스생성->커널오브젝트 정보가 채워짐

커널오브젝트의 구조체내에 상태를 저장하는 멤버가있는데 이는 매우 중요하다.

Signaled, Non-Signaled 이 있다.

전자는 프로세서를 종료시 상태를 나타내는거고 후자는 프로세스가 생성시 나타내는 상태이다.

그리고 중요한것은 프로세스커널오브젝트 상태는 일단 Signaled이 되면 Non-Signaled가 될수 없다.

그래서 프로세스상태정보를 확인하는 시스템함수가 있다.

DWORD WaitForSingleObject(
    HANDLE hHandle,
    DWORD dwMilliseconds
};

첫번재 인자는 상태확인을 할 커널오브젝트의 핸들을 인자로 한다.
두번째 인자는 커널오브젝트가 Signaled 이 되었을때까지 기다리는 함수이다. 즉 타임아웃의 개념이다.
보통 INFINITE라고 많이 넣는데 이것은 커널오브젝트가 Signaled 상태가 될때까지 무한정 기다리는 것이다.


반환값은 다음과 같다
WAIT_OBJECT_0 : 커널 오브젝트가 Signaled이 되었을때
WAIT_TIMEOUT : 커널오브젝트가 Signaled이 되지않고 두번째 인자를통해 설정된 시간이 다되었을때
WAIT_ABANDONED : 소유관계에 관련하여 함수가 정상적인 못한 오류가 발생될경우이다.

추가로 하나더

DWORD WaitForMultipleObjects(
    DWORD nCount;  //배열에 저장되어있는 핸들의 갯수
    const HANDLE* lpHandles,//배열의 첫번째 핸들의 주소값 즉 이주소값을 시작으로 핸들의 관찰대상이된다
    BOOL bWaitAll, // 관찰대상이 모두 Signaled상태가 기다리는(TRUE) 아니면 하나라도 Signaled이 되는지 
                        //(FALSE)결정
    DWORD dwMilliseconds// 타임아웃 설정용도
);


즉 여러개의 프로세스를 생성하고 하나로 관리하기 위해서 쓰기위한 함수이다.

환경설정시작! 삽질이 사는 이야기

우선

mango24보드 구매하고

거기에 wince 포팅, 디버거 그리고 네비를 올려봐야겠고, 그전에 일단 nds 에뮬레이터 돌아가는지 확인하고(되면 대박)

네비,nds,mp3,pmp 기능을 다갖춘 멋진 디바이스를 만들어봐야겠다.

일단 우선 집에가서 win7 플랫폼빌더 evc부터 깔고

시작해야지

일단 mango24 지르고 어플리케이션좀 건들어봐야겠다.!!

이제부터 한섹션은 mango세상의 메뉴섹션으로 만들겠습니다.ㅋ


1 2 3 4 5