전공/MFC 삽질들..
[MFC] CWinThread 스레드 생성, 구동, 종료, 클래스나 구조체 넘기기
무한공백
2011. 8. 18. 01:18
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자리에 구조체의 포인터(주소)를 넘기면 됩니다.