MFC and PostMessage problem in Release build
I 've an application developed with MFC, which behaves abnormally in
the release build.
It's a dialog-based application with two buttons START and STOP. While
clicking the START, it starts a thread. The thread just sleeps 2000ms
and posts a user-defined message to the dialog. In this message
handler the START button is enabled and STOP is disabled.
My implementation is given below.
#define UWM_STOP (WM_USER + 124)
BEGIN_MESSAGE_MAP(CPostTestDlg, CDialog)
//{{AFX_MSG_MAP(CPostTestDlg)
ON_BN_CLICKED(IDC_BTN_START, OnBtnStart)
ON_BN_CLICKED(IDC_BTN_STOP, OnBtnStop)
ON_MESSAGE(UWM_STOP, OnBtnStop )
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
DWORD WINAPI CPostTestDlg::ThreadFn( LPVOID lpParam )
{
CPostTestDlg* pThis = static_cast<CPostTestDlg*>(lpParam);
while( 1 )
{
Sleep( 2000 );
TRACE(_T("Posting message\n"));
::PostMessage( pThis->m_hWnd, UWM_STOP, 0, 0 );
break;
}
return 0;
}
void CPostTestDlg::OnBtnStart()
{
GetDlgItem( IDC_BTN_START )->EnableWindow( FALSE );
GetDlgItem( IDC_BTN_STOP )->EnableWindow( TRUE );
DWORD dwThreadID;
m_hThread = ::CreateThread(NULL, 0, ThreadFn, (void*)this, NULL,
&dwThreadID);
}
void CPostTestDlg::OnBtnStop()
{
TRACE(_T("Stop receieved\n"));
::WaitForSingleObject( m_hThread, INFINITE );
::CloseHandle( m_hThread );
GetDlgItem( IDC_BTN_START )->EnableWindow( TRUE );
GetDlgItem( IDC_BTN_STOP )->EnableWindow( FALSE );
}
These code runs smoothly in debug build. When I run it in release
mode, for the first two START and STOP it works fine. When I click
the start third time it crashes.
I've encountered this problem in a complex project. In order to
confirm this issue, I tried this in a sample project (code listed
above). But this problem occurs in this simple project too.
Could someone see something wrong in my code?