我给主窗口定义了一个消息后,在一个线程内部给发送这个消息。
问题:
第一次建立线程,线程发送消息成功。当第二次的时候就出问题了。
就是说如果两次经过那段代码就会出问题,说内存中某一段不能为read。我的消息函数什么也没做,是个空函数。相关代码:
//线程内部代码,把这行删了一点问题都没有。
AfxGetApp()->GetMainWnd()->PostMessage(WM_DELETE,0);//消息响应函数是:
void CFce2Dlg::OnDelete(WPARAM wParam)
{
return;
}我仔细检查过,应该没有内存方面的问题:
线程函数从CreateThread()取得一个结构指针,用完之后在线程内delete了,用new创建的一个对象也在用完后delete。应该没有内存管理方面的问题吧?
问题:
第一次建立线程,线程发送消息成功。当第二次的时候就出问题了。
就是说如果两次经过那段代码就会出问题,说内存中某一段不能为read。我的消息函数什么也没做,是个空函数。相关代码:
//线程内部代码,把这行删了一点问题都没有。
AfxGetApp()->GetMainWnd()->PostMessage(WM_DELETE,0);//消息响应函数是:
void CFce2Dlg::OnDelete(WPARAM wParam)
{
return;
}我仔细检查过,应该没有内存方面的问题:
线程函数从CreateThread()取得一个结构指针,用完之后在线程内delete了,用new创建的一个对象也在用完后delete。应该没有内存管理方面的问题吧?
不要乱delete
只是我要向线程函数传递一个结构指针。
线程用完那个结构后当然就把它delete了!
难道我在线程外面把传递给线程函数的结构指针delete了?那谁来保证线程结束后才把那个指针delete?而且问题不在内存管理上,我觉得。
如果不发发送消息就不会出现错误。蚂蚁:我是发送后就退出线程了。这样不妥吗?
可能是这个窗口句柄无效的缘故。
你不妨这样做。
在你的程序中定义这个一个结构
struct ThreadParam
{
HWND hWnd;
LPARAM lParam;
};ThreadParam *pThreadParam = HeapAlloc(GetProcessHeap(), 0, sizeof(ThreadParam));
pThreadParam->hWnd = m_hWnd;
pThreadParam->lParam = (LPARAM)您自己的数据CreateThread(NULL, 0, pThreadParam, ThreadProc, 0, 0, &dwThreadID);UINT WINAPI ThreadProc(LPVOID lpVoid)
{
ThreadParam *pThreadParam = (ThreadParam*)lpVoid;ASSERT(IsWindow(pThreadParam->hWnd));PostMessage(pThreadParam->hWnd, WM_DELETE, 0, 0);HeapFree(GetProcessHeap(), 0, lpVoid);
return 0L;
}
如果在您的程序的基础上添加如下语句:
AfxBeginThread(ThreadProc, (LPVOID) &pThreadParam,PRIORITY_IDLE);
意思是...?
我也碰到了这样的问题,而且是debug没问题,release有问题,第一次没错,第二次就出错了!去掉发送消息那句就没问题。
{
return;
}
函数的定义不对,导致栈压得不对,DEBUG下面有内存保护,所以可能不会出现问题
,但是release下面直接出错,重新定义就可以了
LRESULT OnDelete(WPARAM, LPARAM)
跟 DoubleJiang(Double)意见相同