在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版又不能设断点单步调试。究竟是什么导致这种错误的呢,请各位指教。
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版又不能设断点单步调试。究竟是什么导致这种错误的呢,请各位指教。
解决方案 »
- COLORONCOLOR:删除像素。该模式删除所有消除的像素行,不保留其信息什么意思????
- 如何使用AxtiveX控件中的windows media play 实现顺序播放与随机播放
- 如何保存打印设置
- 忽然不想搞程序了!
- 请问,安装VC++6时,你们安装那些附带的工具软件吗?你们都常用哪些工具?哪些是必须安装的呢?
- 怎么把对话框的Picture控件中的位图读到句柄中?帮帮小妹啊!
- 关于SDI的问题
- 请教关于图像编程
- 如何结束一个自己用WINEXEC()开始的进程?
- 为什么我的VC动态提示没有了?
- 关于WMI的问题
- 在wince上写了一个串口的发送工具,抓log的时候在writefile,走不出来了。
=>
void CDlgThreadTestDlg::RandomShow(WPARAM, LPARAM)