티스토리 뷰
1. 스레드의 생성
CWinThread *pThread = ::AfxBeginThread(ThreadFunc, LPVOID)
ThreadFunc : 스레드로 구동시킬 함수의 이름
LPVOID : 스레드에 넘겨줄 함수의 데이터나 구조체, 클래스의 포인터
2. 스레드의 구동
스레드에 들어갈 함수는 전역으로 다음과 같이 선언됩니다.
UINT ThreadFunc(LPVOID param);
3. 스레드 종료
스레드 생성시 만든 pThread 포인터를 이용하여 TerminateThread 함수를 호출할 수 있습니다.
하지만, 스레드를 강제 종료시키는 일은 스레드가 자신이 사용한 메모리를 해제하는 일 등의 정리할 기회도 없이
갑자기 종료되므로, 많은 문제를 일으킬 수 있습니다. 따라서, 다음과 같이 while문의 조건을 변경시켜서 벗어나게 하는 것이 올바른 방법입니다.
스레드가 다음과 같다면,
UINT ThreadFunc(LPVOID param) {
while(m_bThreadFlag)
{
....
}
}
메인에서 버튼을 클릭했을때, 조건을 멈추도록 합니다.
void XXXDlg::OnStop()
{
CWinThread *pThread = ::AfxBeginThread(ThreadFunc, LPVOID)
ThreadFunc : 스레드로 구동시킬 함수의 이름
LPVOID : 스레드에 넘겨줄 함수의 데이터나 구조체, 클래스의 포인터
2. 스레드의 구동
스레드에 들어갈 함수는 전역으로 다음과 같이 선언됩니다.
UINT ThreadFunc(LPVOID param);
3. 스레드 종료
스레드 생성시 만든 pThread 포인터를 이용하여 TerminateThread 함수를 호출할 수 있습니다.
하지만, 스레드를 강제 종료시키는 일은 스레드가 자신이 사용한 메모리를 해제하는 일 등의 정리할 기회도 없이
갑자기 종료되므로, 많은 문제를 일으킬 수 있습니다. 따라서, 다음과 같이 while문의 조건을 변경시켜서 벗어나게 하는 것이 올바른 방법입니다.
스레드가 다음과 같다면,
UINT ThreadFunc(LPVOID param) {
while(m_bThreadFlag)
{
....
}
}
메인에서 버튼을 클릭했을때, 조건을 멈추도록 합니다.
void XXXDlg::OnStop()
{
m_bThreadFlag = FALSE;
}
4. 스레드에 클래스, 구조체 넘기고 받기
통상 저는 이렇게 사용합니다. 만약에 다이얼로그 기반의 XXXDlg 에서 스레드를 생성한 경우
CWinThread *pThread = ::AfxBeginThread(ThreadFunc, this);
위와 같이 this를 넘기고
UINT ThreadFunc(LPVOID param){
XXXDlg *pDlg = (XXXDlg *)param;
pDlg->(멤버변수 또는 함수 접근)
....
}
이렇게 하면, XXXDlg의 멤버 변수 또는 함수를 받을 수 있습니다. 구조체를 넘길때에는 this자리에 구조체의 포인터(주소)를 넘기면 됩니다.
}
4. 스레드에 클래스, 구조체 넘기고 받기
통상 저는 이렇게 사용합니다. 만약에 다이얼로그 기반의 XXXDlg 에서 스레드를 생성한 경우
CWinThread *pThread = ::AfxBeginThread(ThreadFunc, this);
위와 같이 this를 넘기고
UINT ThreadFunc(LPVOID param){
XXXDlg *pDlg = (XXXDlg *)param;
pDlg->(멤버변수 또는 함수 접근)
....
}
이렇게 하면, XXXDlg의 멤버 변수 또는 함수를 받을 수 있습니다. 구조체를 넘길때에는 this자리에 구조체의 포인터(주소)를 넘기면 됩니다.
'전공 > MFC 삽질들..' 카테고리의 다른 글
[MFC] WinDiff 유틸리티 (0) | 2011.08.18 |
---|---|
[MFC] 컴파일 에러에 따른 대처법 (0) | 2011.08.18 |
[mfc 오류] 선언되지 않은 식별자 _lpa, _convert, _acp (0) | 2011.08.03 |
MFC 상호 참조 (0) | 2011.06.15 |
CScrollView 기본 설정 (0) | 2011.06.10 |
댓글