UINT CSockettestDlg::ComputeThreadProc(LPVOID pParam)
{
    struct sockaddr_in remote_addr;
int sin_size=sizeof(struct sockaddr_in);
while(1)
{
if((client_fd=accept(sockfd,(struct sockaddr *)&remote_addr,&sin_size))!=-1)
GetDlgItem(IDC_BUTTON1,GetSafeHwnd())->SetWindowText("断开");
}
return 0;
}编译出现error C2352: 'CWnd::GetSafeHwnd' : illegal call of non-static member function
        f:\vc98\mfc\include\afxwin.h(1912) : see declaration of 'GetSafeHwnd'
D:\网络通信\sockettest\sockettestDlg.cpp(197) : error C2227: left of '->SetWindowTextA' must point to class/struct/union换成GetDlgItem(IDC_BUTTON1)->SetWindowText("断开");也不行

解决方案 »

  1.   

    线程函数中不要做更新UI的操作,改为发送自定义的消息到UI线程,在UI线程的消息响应函数中去更新控件信息。
      

  2.   

    CSockettestDlg *pDlg = (CSockettestDlg *)pParam;
    pDlg ->GetDlgItem(IDC_BUTTON1,GetSafeHwnd())->SetWindowText("断开");
    前提是你传窗口类的指针给线程
      

  3.   

    把CSockettestDlg的窗口指针传到ComputeThreadProc中
    http://topic.csdn.net/u/20110225/08/597acd2c-b454-4356-9f94-266cfab6e29e.html
    然后通过
    pDlg->GetDlgItem(IDC_BUTTON1)->SetWindowText("断开");
      

  4.   

    GetDlgItem(g_hWnd,IDC_BUTTON1)->SetWindowText("断开");
    这种应该是 传窗口句柄给线程,线程发消息给窗口让其更新界面....
      

  5.   

    一般不建议在线程函数中直接操作MFC窗口对象,可以通过传递窗口句柄,然后发送消息的PostMessage的方式,给主线程,然后主线程来GetDlgItem更新控件等.
      

  6.   

    你没有对象的指针调用对象的非静态成员函数当然不行,你必须传指针进线程即使有指针,直接调用GetDlgItem也是不行的,CWnd对象禁止跨线程直接使用
      

  7.   

     create 线程的时候, 传递你 mFC的 this进去,就可以满足要求了
      

  8.   

    GetDlgItem(IDC_BUTTON1)SetWindowText("断开");
      

  9.   

    线程函数是可以带一个LPVOID型的参数。
    在Create线程的时候传给线程函数。
    线程函数里面再进行一次类型转换。
    这样就可以访问那个类型了。