AfxBeginThread
AfxBeginThread
는 MFC프로그래밍에서 다중 쓰레드를 생성할 수 있게 해준다. 특히 AfxBeginThread
는 객체 하나를 리턴하게 되는데 CWinThread
의 인스턴스 리턴하게 된다. 이때 용도에 따라 UI Thread, Worker Thread 로 사용할 수 있다.
CWinThread::m_bAutoDelete
AfxBeginThread
로 생성한 CWinThread
인스턴스는 쓰레드 종료시 주의할 점이 있는데 바로 종료시 자동으로 삭제된다는 점이다. CWinThread
의 맴버 변수에는 m_bAutoDelete
가 존재하는데 기본적으로 TRUE
로 설정 되어있다. 쓰레드 종료시 자동으로 객체를 삭제할지를 설정하는 변수이다.
쓰레드를 종료하고나서 쓰레드의 종료코드를 구한다던지, 종료할 쓰레드를 핸들을 가지고 기다린다던지 해야할 때 필요한게 쓰레드 핸들이다. CWinThread
의m_hThread
에 핸들이 저장되어있는데 종료시 객체가 삭제되니 접근하기 어려워진다. 이러한 경우 MSDN에서는 아래와 같이 사용 하라고 권장 하고 있다.(https://docs.microsoft.com/ko-kr/cpp/parallel/multithreading-terminating-threads?view=vs-2019)
-
m_bAutoDelete
데이터 멤버를 FALSE로 설정 합니다. 이렇게 하면 스레드가CWinThread
종료 된 후에도 개체를 계속 사용할 수 있습니다. 그런 다음 스레드가 종료 된m_hThread
후에 데이터 멤버에 액세스할 수 있습니다. 그러나이 방법을 사용 하는 경우 프레임 워크에서 자동으로 삭제 하지CWinThread
않으므로 개체를 소멸 해야 합니다. 이것은 기본적으로 사용되는 방법입니다. -
스레드의 핸들을 별도로 저장 합니다. 스레드를 만든 후에는를 사용
m_hThread
하 여::DuplicateHandle
데이터 멤버를 다른 변수에 복사 하 고 해당 변수를 통해 액세스 합니다. 이러한 방식으로 종료가 발생 하면 개체가 자동으로 삭제 되 고 스레드가 종료 된 이유를 확인할 수 있습니다. 핸들을 복제 하려면 스레드가 종료 되지 않도록 주의 해야 합니다. 이 작업을 수행 하는 가장 안전한 방법은 AfxBeginThread에 CREATE_SUSPENDED를 전달 하 고, 핸들을 저장 한 다음 ResumeThread를 호출 하 여 스레드를 다시 시작 하는 것입니다.
정리를 하자면 쓰레드를CREATE_SUSPEND
상태로 생성, m_bAutoDelete
를 TRUE
로 설정하고 ResumeThread
로 설정하여 실행하거나 핸들을 복사하여 쓰레드핸들을 별도로 저장해 놓으라는 것이다. 이렇게 m_bAutoDelete = TRUE
로 설정하 경우 CWinThread
객체를 별도로 소멸시켜줘야 한다.
예시 코드
g_pThread = AfxBeginThread(ThreadTest, this,0,0,CREATE_SUSPENDED,0);
g_pThread->m_bAutoDelete = FALSE;
g_pThread->ResumeThread();
AfxMessageBox(_T("Thread is Started."));
WaitForSingleObject(g_pThread->m_hThread, 2000);
delete g_pThread;
g_pThread = NULL;
'개발 > Windows' 카테고리의 다른 글
DeviceIoControl에서 Overlapped I/O 사용하기 (4) | 2020.02.18 |
---|---|
UINT32 정수형 IP주소 스트링 변환하기 / MFC / C++ (0) | 2020.02.13 |
Windows 커널모드 메모리 할당과 페이지 단편화 -ExAllocatePoolWithTag (0) | 2020.01.14 |
DeviceIoControl 버퍼 사용법 (0) | 2020.01.07 |
드라이버와 통신하기 IRP_MJ_DEVICE_CONTROL (0) | 2020.01.07 |
댓글