线程中SendMessage用Release执行异常
来源:百度知道 编辑:UC知道 时间:2024/05/13 08:15:15
编译器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进行了优化,不知道最终原因。书上也有这样的代码是这么写的可以运行。实在是超自然现象啊