线程中SendMessage用Release执行异常

来源:百度知道 编辑:UC知道 时间:2024/05/13 08:15:15
我创建一个基于对话框的程序,在Debug下执行一切正常,但是Release编译后,点确定,然后点确定或者退出什么的就会当掉。谁知道为什么?谢谢了

编译器VC++6.0
代码就是框架生成,然后增加的如下代码

WM_LOG消息定义
消息影射代码
g_hWnd 是HWND类型全局变量
OnOK()
{
g_hWnd = GetSafeHwnd();
DWORD dwThreadID;
CreateThread(
NULL, 0,
(LPTHREAD_START_ROUTINE)TSer,
(LPVOID)this, 0, &dwThreadID );
}

//线程函数
DWORD TSer( LPVOID dwParam )
{
while ( 1 )
{
::SendMessage( g_hWnd, WM_LOG, 0, 0 );
Sleep( 5000 );

}
return 0;
}
//WM_LOG消息响应函数
void CTeststDlg::OnLog( LPCTSTR strLog )
{
}

嗯HWND不存在应该也不会错...
他都说了DEBUG不会出问题...
正确的接受窗口消息应该这样定义...
头文件 xx.h中
afx_msg LRESULT OnLog(WPARAM wParam,LPARAM lParam);
要和其它AFX_MSG函数写一起
然后XXX.CPP
LRESULT CTeststDlg::OnLog(WPARAM wParam,LPARAM lParam)
{
.......
return 0;
}
//在消息响应地方这样写
ON_MESSAGE(WM_LOG,OnLog)
你那样的接收消息函数在VS中无法编译在VC6.0中虽然能编译但会出错!!
如果还有问题可以使用一下县城类CWinThread

主程序退出时,你的线程没有退出啊
线程找不到老爸了,并且主程序退出后,g_hWnd所代表的窗体是否还存在,如果不存在,肯定宕掉,所以发送消息之前一定要检查g_hWnd是否还存在
设置一个BOOL变量,在OnOK设置为TRUE,在OnCancel设置为FALSE
在线程函数的循环中检查该BOOL变量,如果是FALSE就退出

应该加一个程序退出的标志,否则TSer线程一直在运行,
把SendMessage替换成PostMessage看看行不行?

所谓的当掉是什么样的表现?

当然会挂掉,你CreateThread创建的线程所用的代码区在进程关闭时被释放,直接会访问非法内存或者执行非法指令

模态对话框在OnOK() 之后主窗口已消失
g_hWnd已经不存在

确实是这样。这样的事应该是编译后有所改变,调试版Debug编译时附加了很多的调试信息。而最终版Release进行了优化,不知道最终原因。书上也有这样的代码是这么写的可以运行。实在是超自然现象啊