我建了一个基于单文档的工程,其视图是基于对话框的。我想用线程动态改界面上的文本框的值!
UINT Thread1(LPVOID param)
{    view->m_Length=80; //CCeshiView  *view
      view->UpdateData(false);//问题好像出在这
return 0;
}
void CCeshiView::OnStatic1() //静态文本的单击事件
{ AfxBeginThread(Thread1,0);
}
这段程序编译时能通过,但是单击静态文本是就报错!!
好像是说非法访问!!
我只要把view->UpdateData(false);这句注释了就好了!!
求大家帮我看看了!!谢谢了!!

解决方案 »

  1.   

    你这个view是怎么得到的?贴出来看看
      

  2.   

    这个最好是自定义消息,之后在SendMessage();
      

  3.   

    自己看看updatedata的定义,就知道了。
    BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
    {
    ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal? CDataExchange dx(this, bSaveAndValidate); // prevent control notifications from being dispatched during UpdateData
    _AFX_THREAD_STATE* pThreadState = AfxGetThreadState();//这里
    HWND hWndOldLockout = pThreadState->m_hLockoutNotifyWindow;
    ASSERT(hWndOldLockout != m_hWnd);   // must not recurse
    pThreadState->m_hLockoutNotifyWindow = m_hWnd; BOOL bOK = FALSE;       // assume failure
    TRY
    {
    DoDataExchange(&dx);
    bOK = TRUE;         // it worked
    }
    CATCH(CUserException, e)
    {
    // validation failed - user already alerted, fall through
    ASSERT(!bOK);
    // Note: DELETE_EXCEPTION_(e) not required
    }
    AND_CATCH_ALL(e)
    {
    // validation failed due to OOM or other resource failure
    e->ReportError(MB_ICONEXCLAMATION, AFX_IDP_INTERNAL_FAILURE);
    ASSERT(!bOK);
    DELETE_EXCEPTION(e);
    }
    END_CATCH_ALL pThreadState->m_hLockoutNotifyWindow = hWndOldLockout;
    return bOK;
    }
      

  4.   

    是这样子,你新建一个线程,系统就给你分配出一个新堆,所以在执行线程函数的时候首先就要将传递的参数压栈。你所以你的UpdateData就要窗口的句柄!这样它才知道对那个窗口UpdateData