-Dlg.h 파일에 쓰레드 핸들링을 위한 변수 선언
typedef enum {
THREAD_STOP,
THREAD_RUNNING,
THREAD_PAUSE
}_ThreadStatus;
//...
public:
CWinThread* m_pThread;
_ThreadStatus m_threadStatus;
쓰레드 함수 전역으로 정의
만약 메인 함수로 정의하려면 앞에 static 을 붙여야 한다. 함수 앞에 static을 붙이면 전역으로 취급되지만 해당 소스파일 내에서만 호출할 수 있다.
UINT ThreadRepeat(LPVOID LpData)
{
CdeltaControlDlg* pDlg = (CdeltaControlDlg*)(LpData);
vector<DataRow*>& refList = pDlg->DC.getList();
while (pDlg->m_threadStatus == THREAD_RUNNING)
{
//...
}
return 0;
}
쓰레드의 생성 및 시작 또는 중단상태인 쓰레드를 재개
void CdeltaControlDlg::OnBnClickedButtonRun()
{
if (m_pThread == NULL)
{
m_pThread = AfxBeginThread(ThreadRepeat, (LPVOID)this);
if (m_pThread == NULL)
{
AfxMessageBox(_T("ERROR : Fail to begin thread."));
}
else
{
m_pThread->m_bAutoDelete = FALSE;
m_threadStatus = THREAD_RUNNING;
}
}
else if (m_threadStatus == THREAD_PAUSE)
{
m_pThread->ResumeThread();
m_threadStatus = THREAD_RUNNING;
}
}
CWinThread 객체의 멤버 변수인 m_bAutoDelete는 디폴트값이 TRUE이고 TRUE일 때 쓰레드 종료 시 자동으로 삭제 된다. 해당 값을 FALSE로 설정하면 쓰레드 종료 시 자동삭제를 방지하고 사용자가 CWinThread 객체를 delete 해주어야 한다는 뜻이다. 쓰레드 종료 후에도 핸들로 접근해서 처리할 일이 있을 때 쓰이는 방법이다.
쓰레드 일시 중단
void CdeltaControlDlg::OnBnClickedButtonSuspend()
{
if (m_pThread != NULL)
{
m_pThread->SuspendThread();
m_threadStatus = THREAD_PAUSE;
}
}
쓰레드 종료
void CdeltaControlDlg::OnBnClickedButtonStop()
{
terminateThread();
}
void CdeltaControlDlg::terminateThread()
{
if (m_pThread != NULL)
{
//...
m_pThread->SuspendThread();
DWORD dwResult;
GetExitCodeThread(m_pThread->m_hThread, &dwResult);
delete m_pThread;
m_pThread = NULL;
m_threadStatus = THREAD_STOP;
//...
}
}
쓰레드의 종료는 ON_DESTORY 함수에도 써줘야 하고 Com Port를 쓰는 쓰레드라 시리얼 통신이 종료됐을 때도 써줘야 하고 여기저기 쓸 일이 많아서 함수화했다.
Reference : https://m.blog.naver.com/mincheol9166/220718941148
'프로그래밍 > MFC (C++)' 카테고리의 다른 글
MFC ] 엔터, ESC 키 입력시 종료되지 않게하기 (0) | 2023.09.15 |
---|---|
MFC ] 리스트 컨트롤에 행 단위 색상 입히기 (글자색/배경색) (1) | 2022.09.18 |
MFC ] 새 코드 요소를 반환하지 못했습니다. 구문 오류일 수 있습니다. 해결방법 (0) | 2022.09.18 |
Warning: skipping non-radio button in group 경고 제거하는 법 (0) | 2022.09.14 |
MFC ] 라디오 버튼 그룹 지정하여 사용하기 + 초기값 지정하기 (0) | 2022.09.13 |