728x90

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를 먼저 파괴해주어야 한다.

728x90

+ Recent posts