stdafx 란
Standard Application Freamworks 의 약자로 개발자들의 생산성 향상을 위해
MS 에서 제공하는 소프트웨어 라이브러리 체계를 뜻하며,
MFC 로 구성되어 있다.
참고로 많이 사용되는 application framework 로는
.NET Framework( Windows 계열 ),
Cocoa ( Objective C / Mac OS X),
Swing (Java) 등이 있다.
그럼 Precompiled header (미리 컴파일된 헤더. 여기에서는 precompiled header 로 통일) 란 무엇인가...
C / C++ 언어에서 헤더 파일은 C 전처리기(preprocessor) 에 의해 자동적으로 소스 코드를 포함하게 된다.
그런데 일부 헤더 파일의 경우 방대한 크기의 소스 코드를 포함할 수 있고( 예를 들면 window.h),
이런 코드들을 매번 컴파일하면 컴파일 시간이 매우 길어지게 된다.
그래서
자주 바뀌지 않는 기본적인 라이브러리들의 경우에 컴파일 시간을 줄이고자
컴파일러가 사전에 헤더 파일들을 미리 컴파일 해 놓고 쓸 수 있게 하고 있다.
이렇게 컴파일 시간을 줄이기 위해 사전에 컴파일한 결과물이 VC 의 경우
pch(precompiled header) 라는 확장자 명으로 저장된다. 비주얼 스튜디어의 솔루션 폴더에 생기는
프로젝트명.pch 가 바로 그것이다.
precompiled header 를 사용할 경우 precompiled header 로 지정한 헤더 파일 및 소스 코드는 컴파일시에 컴파일 되지 않고 pch 의 결과물을 가져다 사용하게 되는 것이다.
stdafx.h 가 포함하는 정보는 무엇들인가요?
자주 사용되는 공용 소스들을 precompiled header 로 만들어 제공
stdafx.h 에 포함하는 내용들을 살펴보면 윈도우 객체 생성에 필요한
기본 클래스 (afx.h / afxwin.h 등),
윈도우 컨트롤( afxctl.h / afxcmn.h 등),
기본 DB 관련 클래스 ( afxdb.h / afxdao.h ),
네트워크 관련 클래스 ( afxsock.h ) 등등 기본적인 프레임워크 구축에 필요한
필수 헤더들이 포함되어 있다.
stdafx.h 에 어떤 내용을 넣으면 되나요
앞서 말했듯이 stdafx.h 는 한번만 미리 빌드해 놓고 그 다음부터는 재빌드 안하고 쓰는 모듈들이 되야 하므로,
precompiled header 인 stdafx.h 에는프로젝트 진행 중에 거의 값이 바뀌지 않는 외부 라이브러리나 전역 변수 등의 내용을
포함시키면 된다.
이들을 pch 로 만들어 놓고 빌드하면 매번 재빌드 하지 않고 컴파일 시간을 많이 줄일 수 있다.
참고로, GCC ( .gch ) , C++ Builder ( vcl.h ) 등에서도 precompiled header 를 지원한다.
에러 : fatal error C1010: unexpected end of file while looking for precompiled header directive
미리 컴파일된 헤더 지시문을 찾는 동안 예기치 않은 파일의 끝이 나타났습니다
( 혹은 버전에 따라 "Did you forget to add '#include "stdafx.h"' to your source?" 라는 문구가 표시되기도 함 )
해결방안 : precompiled header 를 사용하도록 설정된 상태에서 컴파일을 하였는데 precompiled header 를 찾지 못했다는 의미.
보통 해당 소스코드에 stdafx.h 가 인클루드 되어 있지 않거나, stdafx.h 의 위치가 잘못 되어 있어서 발생한다.
stdafx.h 를 소스코드의 가장 위쪽에서 include 하도록 해 주면 된다.
혹은 precompiled header 가 잘못 세팅되어 찾지 못하는 문제일수도 있다. precompiled header 를 사용 안함으로 체크하여 pch 를 현재 소스 코드에 맞게 재 생성을 해 준다.
에러 : fatal error C1853: "Debug/test.pch" is not a precompiled header file created with this compiler
해결방안 : 현재 소스 코드에서 사용할 수 있는 pch 와 버전이 맞지 않는다는 의미.
precompiled header 를 사용 안함으로 체크하여 pch 를 현재 소스 코드에 맞게 재 생성을 해 준다.
01-02 03:07:19.389: DEBUG/[debug](2469): _onSaveInstanceState
01-02 03:07:19.389: DEBUG/[debug](2469): _onPause
01-02 03:07:19.413: DEBUG/[debug](2469): _onWindowFocusChanged
01-02 03:07:19.600: DEBUG/[debug](2469): _surfaceDestroyed
01-02 03:07:19.889: DEBUG/[debug](2469): _onStop
홈버튼 길게 눌러 복귀시엔
01-02 03:08:37.022: DEBUG/[debug](2469): _onStart
01-02 03:08:37.022: DEBUG/[debug](2469): _onResume
01-02 03:08:37.038: DEBUG/[debug](2469): _surfaceCreated
01-02 03:08:37.038: DEBUG/[debug](2469): _surfaceChanged
01-02 03:08:37.569: DEBUG/[debug](2469): _onWindowFocusChanged
요래 찍히는 군요
제가 사용하는 코드입니다.
surfaceDestroyed시에 join으로 스레드를 종료시키고
다시 surfaceCreated 될 때 새로 스래드를 생성해서 실행해줍니다.
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(LOG_FLAG) Log.d("[debug]", "_surfaceDestroyed");
boolean retry = true;
thread.setRunning(false);
while (retry) {
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}