我给主窗口定义了一个消息后,在一个线程内部给发送这个消息。
问题:
第一次建立线程,线程发送消息成功。当第二次的时候就出问题了。
就是说如果两次经过那段代码就会出问题,说内存中某一段不能为read。我的消息函数什么也没做,是个空函数。相关代码:
//线程内部代码,把这行删了一点问题都没有。
AfxGetApp()->GetMainWnd()->PostMessage(WM_DELETE,0);//消息响应函数是:
void CFce2Dlg::OnDelete(WPARAM wParam)
{
    return;
}我仔细检查过,应该没有内存方面的问题:
线程函数从CreateThread()取得一个结构指针,用完之后在线程内delete了,用new创建的一个对象也在用完后delete。应该没有内存管理方面的问题吧?

解决方案 »

  1.   

    你把什么delete?
    不要乱delete
      

  2.   

    本着“谁创建,谁删除”原则,线程函数从CreateThread()取得一个结构指针,在线程内不要delete,线程自己new的,自己delete
      

  3.   

    我当然也不想在不同的地方delete!
    只是我要向线程函数传递一个结构指针。
    线程用完那个结构后当然就把它delete了!
    难道我在线程外面把传递给线程函数的结构指针delete了?那谁来保证线程结束后才把那个指针delete?而且问题不在内存管理上,我觉得。
    如果不发发送消息就不会出现错误。蚂蚁:我是发送后就退出线程了。这样不妥吗?
      

  4.   

      传给线程函数的指针最好不要在线程函数里delete.
      

  5.   

    AfxGetApp()->GetMainWnd()->PostMessage(WM_DELETE,0);
    可能是这个窗口句柄无效的缘故。
    你不妨这样做。
    在你的程序中定义这个一个结构
    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;
    }
      

  6.   

    问smallfool(smallfool):
    如果在您的程序的基础上添加如下语句:
    AfxBeginThread(ThreadProc, (LPVOID) &pThreadParam,PRIORITY_IDLE);
    意思是...?
      

  7.   

    你用postmessage默认是穿一个Message,函数的定义要用LRESULT OnDelete(WPARAM, LPARAM),你的release版肯定也有问题的!
      

  8.   

    强烈关注!
    我也碰到了这样的问题,而且是debug没问题,release有问题,第一次没错,第二次就出错了!去掉发送消息那句就没问题。
      

  9.   

    void CFce2Dlg::OnDelete(WPARAM wParam)
    {
        return;
    }
     函数的定义不对,导致栈压得不对,DEBUG下面有内存保护,所以可能不会出现问题
    ,但是release下面直接出错,重新定义就可以了
    LRESULT OnDelete(WPARAM, LPARAM)
    跟 DoubleJiang(Double)意见相同
      

  10.   

    啊,当然还有DoubleJiang(Double)!