티스토리 뷰

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()
{
m_bThreadFlag = FALSE;
}

4. 스레드에 클래스, 구조체 넘기고 받기
통상 저는 이렇게 사용합니다. 만약에 다이얼로그 기반의 XXXDlg 에서 스레드를 생성한 경우
CWinThread *pThread = ::AfxBeginThread(ThreadFunc, this);
위와 같이 this를 넘기고

UINT ThreadFunc(LPVOID param){
 XXXDlg *pDlg = (XXXDlg *)param;
 pDlg->(멤버변수 또는 함수 접근)
 ....
}

이렇게 하면, XXXDlg의 멤버 변수 또는 함수를 받을 수 있습니다. 구조체를 넘길때에는 this자리에 구조체의 포인터(주소)를 넘기면 됩니다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함