Theme site

http://studiostyl.es/

 

 

Theme folder

....\Documents\Visual Studio 2010\Settings

 

 

변경 방법

ex) vs2010

도구 - 설정 가져오기 및 내보내기 - 선택한 환경 설정 가져오기

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MFC code 작성시

header file 에서 변수를 선언하고 초기화를 하려고 하면 빌드에서 이런 문제가 생긴다.

전역변수라도 마찬가지다.

1. header file 에서 변수를 초기화 하지 않도록 하자.

2. header file 에서 전역변수를 선언 하지 않도록 하자.

 

시간 측정이 필요할 때,

timegettime , GetTickCount , rdtsc 등 보다는 QueryPerformanceCounter 의 사용을 권장한다.

물론 주의 사항도 있다.

참고 : http://sweeper.egloos.com/2820035

 

사용법은 아래와 같다.

 

 

1. 변수정의

 LARGE_INTEGER m_CPUFreq; //freq. (초당 clock 수)

 LARGE_INTEGER m_CPUClock1; // 시작 count

 LARGE_INTEGER m_CPUClock2; // 종료 count

 double m_SecInterval; // m_CPUClock1~2 사이의 시간 간격, 단위 sec

 

 

2. 시간 측정

// 현재 cpu의 freq. 를 측정하고

// 시간을 측정하고자 하는 두구간의 clock 을 측정한 후

//clock 차이를 freq. 로 나누어 준다.

 

if(QueryPerformanceFrequency(&m_CPUFreq)) //CPU Freq. 측정

{

    QueryPerformanceCounter(&m_CPUClock1); // 첫번째 count 측정

}

.

.

.

 QueryPerformanceCounter(&m_CPUClock2); // 두번째 count 측정

 

 m_SecInterval =  (double) ( m_CPUClock2.QuadPart

  - m_CPUClock1.QuadPart ) /m_CPUFreq.QuadPart;   // 시간 계산

 

 

 

// 참고 //////////////////////////

// LARGE_INTEGER temp;

//

// QueryPerformanceFrequency(&temp)

// 반환값 : 해당 PC가 QueryPerformanceCount 를 지원할 때 TRUE (아니면 FALSE)

// 결과 : temp.lpFrequency -> 초당 clock 수가 저장됨.

//

// QueryPerformanceCounter(&temp)

// 결과 : temp.QuadPart -> 현재 CPU count가 저장됨.

 

 

리소스 보기에서 해당 Dialog 를 선택하고

단축키 : ctl+D

설정은 1번 부터 순서대로 눌러주면 순서가 바뀌면서 설정된다.

다시 ctl+D 를 누르면 보기/설정 이 종료된다.

 

현재 Class 를 보면 다음과 같이 기본 Class 만 존재하고 있다.

 

여기에, 기존에 클래스로 만들어놓은 소스 및 헤더 파일을 불러와서 Class 를 추가해 보자.

 

 

1.    솔루션 보기로 가서

프로젝트네임을 우클릭 -> 추가 -> 새 필터

 

 

2.    새 필터를 만들고 이름을 넣어준다.

 

 

3.    새 필터를 우클릭 -> 추가 -> 기존항목 을 선택하고

추가하고자 하는 클래스에 관련된 모든 소스파일과 헤더파일을 선택해서 등록한다.

 

 

4.    이제 클래스 뷰로 가보면 새로운 Class 들이 추가된 것을 볼 수 있다.

 

 

5.    이를 C______Dlg (여기선, CaddclasstestDlg) 에서 사용하기 위해서는

Dlg 의 header file 에서

사용하고자 하는 header fille을 include 시켜주고 사용하면 된다.

 

 

1. 전역으로 Thread 작업 함수 선언

UINT ThreadTaskFunc(LPVOID pParam);

 

 

2. Thread 작업 함수에 다음 code를 기본적으로 작성

UINT ThreadTaskFunc(LPVOID pParam)

{

//본 함수는 전역함수 이므로, Dialog Class 의 멤버에 접근하기 위한 포인터 선언

// 이후, pDlg-> 를 사용하여 Dialog 의 멤버에 접근 가능하다.

CProjectDlg* pDlg = (CProjectDlg*)pParam;

 

// 추후, thread 를 안정적으로 종료시키기 위해 m_flag_threadrun 를 Flase 로 만듦.

while(pDlg->m_flag_threadrun)

{

//Thread 작업

}

 

return 0;

}

 

 

3. Thread 시작

// m_flag_threadrun : Dialog class에 정의된 멤버변수

// m_pThread : thread 의 pointer

// CWinThread* m_pThread;

 

//thread 작업 함수가 while() 로 계속 돌아가도록 함.

m_flag_threadrun=TRUE;

 

//thread 시작

m_pThread=AfxBeginThread(ThreadTaskFunc,this);

if(m_pThread==NULL)

{

AfxMessageBox("ERROR: Failed to begin thread");

return;

}

 

 

4. thread 종료

//thread 종료 flag

m_flag_threadrun=FALSE;

 

//thread 가 종료 될 때 까지 기다림

WaitForSingleObject( m_pThread->m_hThread, INFINITE );

 

 

5. 프로그램이 종료 되는 시점에서 thread 종료 code 추가

DestroyWindow() 를 재정의 하고 (Dlg 클래스에서, 속성창에서, 재정의, DestroyWindow

생성된 재정의 함수에 아래 code추가

 

if(m_flag_threadrun=TRUE)

{

[4. thread 종료] 참고

}

 

button 의 caption text 가져와서

button 에 표시되는 text를 toggle 시키는데 유용하게 사용 할 수 있다.

 

CButton m_bt; //해당 버튼 컨트롤러에 대한 멤버변수

CString str="";
m_bt.GetWindowText(str);

 

str에 해당 버튼의 현재 caption 을 가져온다.

 

사용예--------

해당 버튼의 OnBnClick 이벤트 처리 함수에서

 if(str=="Start") //thread 시작
 {
    m_bt.SetWindowTextA("Stop");
 }
 else     //thread 종료
 {
    m_bt.SetWindowTextA("Start");
 }

Dialog 에서 Enter 또는 ESC 키를 눌렀을 때, 오작동 하거나 프로그램이 종료되어 버리는 문제를 해결.

 

Dialog 클래스 선택 -> 속성에서 ->재정의 아이콘 선택 ->preTranslateMessage 함수 재정의

 

 

 

생성된 가상 함수에 아래처럼 코드를 추가한다.

//////////////////////////////////////////////////////////////////////////////////////////////
// Enter , ESC 버그 (종료 방지)
//////////////////////////////////////////////////////////////////////////////////////////////
//
BOOL CSHM_PCcode_ver2Dlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN)
    {
        if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
        return TRUE;
    }

return CDialogEx::PreTranslateMessage(pMsg);

}

아래 그림 순서대로 하면 클래스 뷰에서 클래스가 추가되고

cpp 파일과 h파일이 생성된 것을 알 수 있다.

생성된 헤더 파일을

Dalog 클래스 등에서 include 하고 사용하면 된다.

 

 

 

 

+ Recent posts