Search Results for 'Win32 API'

2 POSTS

  1. 2007.07.10 [Win32] SetTimer() Callback 사용시 주의사항 (2)
  2. 2007.04.25 Win32 Thread의 기초 (4)
실제로 최근에 발견한 어플 버그로 새롭게 알게된 사실이다.
이건 Win32 API를 사용하는 Windows XP나 Windows CE 및 Windows Mobile에 모두 공통적으로 해당되는 내용이다.
전에 API문서에서 본 것도 같지만 실제 기억속에서 잊혀져서 모르는 것과 다름없는 사실이었다.

SetTimer() API를 사용할 때 주기적으로 WM_TIMER 메시지를 받도록 할 수도 있지만 callback함수로 호출되도록 할 수가 있다.

이것과 관련해서 유의해야할 점이 있다. MSDN의 SetTimer() 문서에 다음과 같은 이야기가 있다.

An application can process WM_TIMER messages by including a WM_TIMER case statement in the window procedure or by specifying a TimerProc callback function when creating the timer. When you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.

즉 요약을 하면 TimerProc() 이라는 콜백(callback) 함수를 등록하더라도 윈도우 메시지를 처리하는 window procedure가 있어야 한다는 이야기다. 윈도우를 전혀 생성하지 않는 어플은 콜백방식을 사용하더라도 전혀 SetTimer()함수를 사용할 수가 없다는 이야기이다. 사용하려면 windows procedure를 만들어서 window message를 처리해 주어야 한다.

아래는 아주 오래전 MSDN magazine에서 관련 내용을 설명한 기사의 링크이다.
http://www.microsoft.com/msj/0397/hood/hood0397.aspx


이 기사에 따르면 WM_TIMER 메시지는 항상 발생하고 타이머 콜밸 함수를 등록했을 경우 DispatchMessage() 함수가 호출되었을 때 windows procedure로 WM_TIMER 메시지를 보내는 대신에 콜백함수를 호출하게 된다.

그렇다면 만약 TimerProc() 콜백에서 리턴을 하지 않을 경우 어떤 일이 벌어질까?
결국 WM_TIMER를 처리하는 코드를 계속 수행중인 상태가 되어버리고 그 이후의 윈도우 메시지 처리가 중단된 상태가 되어버린다.
이렇게 되면 TimerProc()이 리턴될 때까지 어플이 락업된 상태가 되어버리니 꽤 심각할 수 있다.
물론 모든 콜백 함수를 사용할 때 주의해야할 점이다.

즉 내용을 정리하면 TimerProc()은 windows procedure와 직접적인 관련이 있어서 처리할 때 그 사실을 염두해 두고 잘 처리를 해야한다.
신고


Win32 Thread의 기초

2007.04.25 20:49
오랜만에 프로그래밍 이야기를 해보려고 한다.
윈도우 프로그램에 익숙한 사람들에게는 새로운 이야기는 아니고
윈도우에서 Thread를 처음 사용하려는 사람들을 위한 팁이다.
아래 이야기는 Windows CE계열의 OS나 Desktop OS에 공통적으로 해당되는 이야기이다.
쓰레드(Thread)가 뭔지는 이미 다 안다고 가정하겠다.

1. 쓰레드(Thread)의 수명
쓰레드의 종료는 Thread Procedure에서 리턴으로 처리하는 것이 맞다.
TerminateThread같은 강제 종료 함수가 있지만 극히 예외적인 상황이 아닌 경우에는 return을 해서 쓰레드를 종료시키는 것이 바람직하다.
때로는 쓰레드가 언제 종료했는지 알아야 할 필요가 있다.
그럴 경우에는 Thread Handle을 사용해서 WaitForSingleObject을 호출하면 된다.
쓰레드가 종료될 경우 signaled 상태로 바뀌므로 쓰레드의 종료를 기다릴 경우 위 방법을 사용하는 것이 가장 정확하다.


2. 쓰레드 핸들(Handle)의 수명
CreateThread를 호출하고 리턴되는 것이 Thread의 handle이다.
처음 Win32 쓰레드를 접했을 때 언제 CloseHandle을 호출해야하는 문제로
자료를 찾았는데 MSDN에서는 명확히 설명되어 있지 않았다.
Handle은 쓰레드를 제어하기 위해서 필요할 뿐 CreateThread후에 바로 CloseHandle을 호출해도 무방하다.
즉, 쓰레드의 수명하고는 전혀 별개이다. 단지 쓰레드와 관련된 함수호출을 할 때만 사용되는 것이다.
쓰레드의 수행에는 전혀 영향을 미치지 않는다. 그러므로 Thread Procedure안에서 CloseHandle을 호출하는 것도 가능하다.

3. Stack size의 조정
각 쓰레드가 생성이 되면 그 쓰레드에 새로운 스택(stack)이 할당이 된다.
stack의 크기는 Visual Studio 프로젝트 설정에서 변경이 가능하다.
쓰레드를 여러 개를 사용하던 안하던 스택사이즈를 초과하는 메모리 할당을 하지 않도록 주의해야 한다.
(예를 들면 스택이 64KB 인데 함수내에서 1MB짜리 배열을 만들경우 stack overflow가 발생한다.
관련 내용을 잘 모르는 분은 stack과 heap에 대해 별도록 공부하기 바란다)
쓰레드를 사용하지 않아도 기본적으로 프로세스의 메인 쓰레드에서 어플이 동작하므로 이건 쓰레드와 상관없이 주의해야 한다.
쓰레드 별로 다양한 스택사이즈가 필요할 경우 CreateThread호출시 옵션으로 지정이 가능하다.

Windows Mobile개발자의 경우 Visual Studio 2005에서 Windows Mobile 프로젝트를 만들경우 default stack size가 1MB로 지정이 되어 있다.
Service Pack1에서 해당 문제는 수정이 된것으로 보인다.
반드시 stack size를 64KB나 적절한 값으로 수정해야만 한다.
그렇지 않을 경우 Virtual Memory부족으로 많은 문제들이 생길 수 있다.
Windows CE 는 6.0 부터 Virtual memory처리방식이 변경되어서 문제가 없지만
Windows Mobile 6.0은 커널(kernel)이 Windows CE 5.0 기반이기 때문에 아직까지 virtual memory문제에서 자유롭지 못하다.
신고



 RSS Feed

방명록

Recent Posts

  1. Xcode4 프로젝트에 프레임..
  2. 특허침해에 휘말리는 iOS..
  3. 최근에 변경된 애플 앱스토..
  4. 아이폰 사용팁 20가지
  5. 나의 관심사 재정리하기

Recent Comments

  1. 영회님 좀 더 자세히 설명해주.. coderiff 2010
  2. 완전 멋진데.. 한가지 아쉬운.. 영회 2010
  3. 그렇군요. 지금까지 Gmail의.. 하인도 2010
  4. 저도 예전에 이것때문에 한동.. coderiff 2010
  5. 어이쿠~ 이런 비밀이 있었네요.. 로드맵 2010

Recent Trackbacks

  1. イベント m lサイズ でスタイ.. イベント m lサイズ でスタイ.. 2014
  2. refurbished laptops refurbished laptops 2014
  3. Personal Security Personal Security 2014
  4. 갤럭시 시리즈의 두번째 버전.. 2011
  5. 하인도의 생각 neohind's me2DAY 2010

Calendar

«   2017/11   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

Bookmarks

  1. The Old New Thing
  2. Windows Mobile Team Blog
  3. Windows CE Base Team Blog
  4. MobileDeveloper wiki
  5. 류한석의 피플웨어
  6. 애자일 이야기

Site Stats

TOTAL 2,634,593 HIT
TODAY 10 HIT
YESTERDAY 70 HIT

티스토리 툴바