在VC6里面,随便实验在一个基于对话框的mfc exe中创建工作者线程,出现了debug版本没问题,release版出错的奇怪情况。比如工程名:DlgThreadTest,基于对话框的mfc exe,在对话框上添加一个button控件IDC_BUTTON_THREAD。在对话框类添加控制成员BOOL m_bStart;初始为FALSE。本意就是按一下按钮启动工作者线程,再按一下按钮停止线程。线程用SendMessage的方式调用主对话框的一个函数RandomShow。线程查找主对话框的成员m_bStart 判断自己是否应该结束。添加全局线程函数ThreadFunction:
UINT ThreadFunction( LPVOID pParam )
{
CDlgThreadTestDlg* pDlg = (CDlgThreadTestDlg*)pParam;
if ( ( pDlg == NULL ) || 
( !pDlg->IsKindOf(RUNTIME_CLASS(CDialog) ) ) )
{
return -1;   //thread function returns error
}

while ( pDlg->m_bStart )    //判断线程是否结束
{
pDlg->SendMessage( WM_RANDOMSHOW, 0, 0 );  //发送消息

} return 0;
}button空间的click事件对应函数 OnButtonThread():
void CDlgThreadTestDlg::OnButtonThread() 
{
// TODO: Add your control notification handler code here
if ( !m_bStart )
{
m_bStart = TRUE;
AfxBeginThread( ThreadFunction, this );
}
else
{
m_bStart = FALSE;   //设置m_bStart,结束线程
}
}在主对话框的MESSAGE_MAP里加上了消息映射:
ON_THREAD_MESSAGE( WM_RANDOMSHOW, RandomShow )RandomShow函数是一个空函数,什么都不作:
void CDlgThreadTestDlg::RandomShow()
{
}就这样一个最简单的东西,在debug版本下没有任何问题,可是在release版本里按下button启动线程,再按一下结束线程后,按“确定”,“取消”按钮或对话框右上的“X”键关闭对话框,就会弹出“0x73d11c7指令引用的0x00000428内存,该内存不能为read”的运行时错误。而在release版又不能设断点单步调试。究竟是什么导致这种错误的呢,请各位指教。