建立一个线程,测试了一下,线程建立成功了。
线程里面:CProjectSWDlg  *pdlg=(CProjectSWDlg*)p;
          ::SendMessage(pdlg->m_hWnd,WM_THREAD, (WPARAM)&Hand.GetAt(0),0);  //发送的是局部变量自定义消息:void CProjectSWDlg::OnThread(WPARAM wParam, LPARAM lParam)  
{
 CString *str;
 str=(CString*)wParam;
         SetDlgItemText(IDC_SHOWDATA,*str);
}运行时,出错,单步调试了一下,显示access violation,好像是内存访问非法,但我不知道是那出错了?

解决方案 »

  1.   

    ::SendMessage(pdlg->m_hWnd,WM_THREAD, (WPARAM)Hand.GetAt(0),0); 自定义消息:void CProjectSWDlg::OnThread(WPARAM wParam, LPARAM lParam)   
    {
      CString str((CHAR*)wParam); 
      SetDlgItemText(IDC_SHOWDATA,str);
    }
      

  2.   


    自定义消息:void CProjectSWDlg::OnThread(WPARAM wParam, LPARAM lParam)   
    {
       CString* pStr = (CString*) wParam;
       CEdit* pEdit = (CEdit *) GetDlgItem(IDC_SHOWDATA); 
      pEdit->SetWindowText(*pStr);
     
    }
      

  3.   

    to 2楼:
     ::SendMessage(pdlg->m_hWnd,WM_THREAD, (WPARAM)&Hand.GetAt(0),0);不要&,编译通不过。to 3楼:
    我把自定义消息注释起来,运行时还是出bug,应该是 ::SendMessage(pdlg->m_hWnd,WM_THREAD, (WPARAM)&Hand.GetAt(0),0);出问题了!
      

  4.   

    ::SendMessage(pdlg->m_hWnd,WM_THREAD, (WPARAM)&Hand.GetAt(0),0);的bug怎么解决?
      

  5.   

    WPARAM参数必须传堆里的,传栈里的肯定不行.但这样会给回收带来麻烦,甚至无法控制.最好是先用WM_COPYDATA把WPARAM的值用LPARAM先送过去,然后发送WM_THREAD时,就不需要带参数了,接收方直接使用WM_COPYDATA传过来的值.
      

  6.   

    如果::SendMessage(pdlg->m_hWnd,WM_THREAD, (WPARAM)&Hand.GetAt(0),0);出错的话,那么你应该检查一下pdlg->m_hWnd是不是有效,同时应该保证前面的p的值是正确的。
      

  7.   

    to wltg2001:UINT CProjectSWDlg::Manipulator_Move_thread(LPVOID p)
    CProjectSWDlg *pdlg=(CProjectSWDlg*)p; //这句应该是正确的,我看静态类成员函数使用类成员都是这么解决的
    怎么检查pdlg->m_hWnd是不是有效,怎么才算有效呢?
      

  8.   

    传(WPARAM)&Hand.GetAt(0)是CString不妥,用WM_COPYDATA好些。
      

  9.   

    //Sender
    CString *pStr = new CString
    pStr->Format("xxxxx");
    SendMessage(window,msg,(WPARAM),pStr);//Receiver
    CString *pStr = (CString*)msg.wparam;//do anything you want....delete pStr;
      

  10.   

    首先,你可以给线程直接传递CProjectSWDlg的句柄,
    其次,你要先定位错误位置,加断点这样改试一下:
    AfxBeginThread(Manipulator_Move_thread, GetSafeHwnd());
    void CProjectSWDlg::OnThread(WPARAM wParam, LPARAM lParam)   
    {
      SetDlgItemText(IDC_SHOWDATA, LPCTSTR(wParam));
    }
    线程里:
    HWND h = (HWND)p;
    ::SendMessage(h,WM_THREAD, (WPARAM)(LPCTSTR)Hand.GetAt(0),0);
      

  11.   

    我改成:AfxBeginThread(Manipulator_Move_thread,this); 就没有运行问题,但编辑框没显示数据。单步调试到:
    void CProjectSWDlg::OnThread(WPARAM wParam, LPARAM lParam)   
    {
      SetDlgItemText(IDC_SHOWDATA, LPCTSTR(wParam)); //这一句,编辑框是空白的,说明数据函数没传过去呀
    }