Re: MFC and PostMessage problem in Release build
On Feb 6, 10:28 am, "Doug Harrison [MVP]" <d...@mvps.org> wrote:
On Thu, 5 Feb 2009 21:10:40 -0800 (PST), Faisal <faisal...@gmail.com>
wrote:
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()
You should move your ON_MESSAGE after the AFX comments,
Is this a coding practice? Or necessary?
but you can't use
the same handler function in ON_BN_CLICKED and ON_MESSAGE. See below for
more.
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, NUL=
L,
&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?
You're using the same message handler for ON_BN_CLICKED and ON_MESSAGE,
whose handler functions are totally different. The ON_MESSAGE handler is
declared like this:
LRESULT Handler(WPARAM, LPARAM);
Also, you're using the raw API to manage your threads, when you should be
using AfxBeginThread. See this page for some very important info on using
MFC's CWinThread correctly:
http://members.cox.net/doug_web/threads.htm
--
Doug Harrison
Visual C++ MVP
Thanks Doug.
The type of Handler was the problem.