MFC에서 Thread를 그냥 막 사용하다보니 잘못 사용한 예가 있어서 정리한다.
예를 들어
void CMyClass::CreateSystemStatusThread()
{
static auto Func = [&]()
{
while(m_bSystemStatusThreadOnOff)
{
if (m_bSystemOnOff)
((CStatic*)GetDlgItem(IDC_STATIC))->SetBitmap(m_pngOn);
else
((CStatic*)GetDlgItem(IDC_STATIC))->SetBitmap(m_pngOff);
Sleep(1000);
}
}
m_bSystemStatusThreadOnOff = true;
m_thrSystemStatus = std::thread(Func);
}
void CMyClass::DestroySystemStatusThread()
{
m_bSystemStatusThreadOnOff = false;
if (m_thrSystemStatus.joinable())
m_thrSystemStatus.join();
}
위와 같이 thread를 만들어놨다고 치자.
그렇다면 DestroySystemStatusThread()를 어디에서 호출해야 하는지 생각을 해보아야 한다.
나의 경우 당연히 CMyClass의 소멸자에 넣으면 잘 종료될 것이라고 생각을 하였지만, 당연히 아니었다.
왜냐하면 CMyClass의 소멸자가 호출되기전에 GetDlgItem(IDC_STATIC)가 먼저 없어지기 때문이다.
즉, 프로그램 종료 중에 GetDlgItem(IDC_STATIC)를 호출하면서 프로그램이 잘못된 것을 참조했다는 에러가 발생하게 된다.
그래서 MFC의 소멸 순서를 확인해 본 결과, OnDestroy()에서 DestroySystemStatusThread() 호출해서 Thread를 먼저 파괴해주어야 한다.
'GUI Toolkit > MFC' 카테고리의 다른 글
MFC - 다양한 예제들 (0) | 2018.09.10 |
---|---|
MFC - MDI 생성시 FileNew를 하지 않는 방법 (0) | 2018.01.08 |
MFC - CImage Memory Leak (0) | 2017.11.17 |
MFC - 타이틀바(Titlebar) 와 테두리(Border) 에 이미지 넣기 (2) | 2017.09.28 |
MFC - 버튼 연속 클릭 시 인식이 안되는 문제 (0) | 2017.09.25 |