程序有主窗口,弹出模式窗口CDlgp2p(聊天),该窗口创建线程AcceptThread,该线程声明为CDlgp2p类的友元,此时在线程AcceptThread中调用CDlgp2p类的ShowRecvData()函数显示接收到的聊天内容,到这里都没有错误,但是在ShowRecvData()函数中使用m_show.SetWindowText(m_showstr);改变Cedit(聊天内容框)值时,出现断言失败(运行时错误),应该是句柄无效,想问怎样改变窗口CDlgp2p中Cedit控件的值?
另外不用友元获取对话框指针的方法也是不行。
UINT AcceptThread(LPVOID lpvoid)
{
    int Addrlength=sizeof(m_raddr);
m_socket=accept(m_hSocket,(LPSOCKADDR)&m_raddr,&Addrlength);
if(m_socket==INVALID_SOCKET)
{
closesocket(m_hSocket);
m_socket=NULL;
AfxMessageBox("Accept Error");
return 0;
}
AfxBeginThread(AcceptThread,NULL);
char buff[1024];
int ret=recv(m_socket,buff,1024,0);
    if(ret==0||ret==SOCKET_ERROR)
{
closesocket(m_socket);
AfxMessageBox("recv bad");
return 0;
}
    if(buff!=NULL)
{
int msgleng=0;
int nameleng=0;
int i;
nameleng=buff[0];
name=new char[nameleng+1];
for(i=0;i<nameleng;i++)
{name[i]=buff[i+1];}
msgleng=buff[nameleng+1];
message=new char[msgleng+1];
for(i=0;i<msgleng;i++)
{
message[i]=buff[i+2+nameleng];
}
name[nameleng]='\0';
message[msgleng]='\0';
CDlgP2P p2p;
p2p.ShowRecvData();
}
return 0;
}void CDlgP2P::ShowRecvData()
{
CString tempstr;
tempstr="";
//m_show.SetWindowText("");
//m_show.Clear();
if(name!=NULL&&message!=NULL)
{
tempstr=name;
m_showstr=message;
m_showstr=tempstr+":"+m_showstr;
AfxMessageBox(m_showstr);
m_show.SetWindowText(m_showstr);//这句造成断言失败,难道原因是此时控件尚未创建?

//UpdateData(FALSE);
message=NULL;
name=NULL;
}
}

解决方案 »

  1.   

    m_show这个窗体或者所属的窗体是动态创建的吧?检查一下。
      

  2.   

    !!程序逻辑有很大问题吧。你说线程由CDlgP2P创建的?那你在线程里面又定义一个CDlgP2P实例,等于新建了一个对话框,这个对话框和前面的那个根本没有任何联系,肯定要出问题的啦。正确的做法应该是在开线程的时候把对话框的指针作为参数传给它,在线程里面用这个指针去操作,而不是新定义一个对象
      

  3.   

    楼上有道理,线程是在void CDlgP2P::OnCreathost() 中启动的
    应该怎么传CDlgP2P的指针啊?