目前,似乎是那些用不到成员变量的成员函数能访问,但其他的函数会报错,是wincore 890行。
现在是这个函数报错,函数是没问题的,不在线程里执行是可以实现的,但一旦在线程中执行就要报错。
void CMyDlg::StartListen()
{
InitVariable();
UpdateData(FALSE);
if(m_nSerCurState!=IsStart)
{
//MessageBox(m_cIP);
if(m_sListenSock.Create(m_nPort,SOCK_STREAM,m_cIP))//创建socket
{
m_cSerCurState=Enum2CString(IsStart);
MessageBox(m_cSerCurState);
if (!m_sListenSock.Bind(m_nPort,m_cIP))//将本地地址与socket绑定在一起
{
MessageBox("绑定失败!");
}
m_sListenSock.Listen(5);//开启监听
WSAAsyncSelect(m_sListenSock,GetSafeHwnd(),ACCEPT_EVENT,FD_ACCEPT|FD_READ|FD_CLOSE);//转变阻塞模式
//WSAAsyncSelect的返回值决定是否成功执行。此函数目的是将阻塞模式转为非阻塞模式,即执行完函数立即返回,若事件发生
//则通过消息告诉窗口,执行相应的函数
//m_bStarting=TRUE;//开始侦听了
}
OutputLastError();
}
UpdateData(FALSE);
}//监听线程
DWORD WINAPI ListenProc(
LPVOID lpParameter)
{
//开始监听
CMyDlg *dlg=((CMyDlg*)lpParameter);
dlg->StartListen();//调用StartListen函数报错
//AfxMessageBox(dlg->GetIP());调用GetIP函数就可以
return 0;
}void CMyDlg::OnBtnStart()
{
// TODO: Add your control notification handler code here
/*创建一个线程用于处理与客户端的数据交互*/
DWORD dwThread; /*lpInfo *lpPara;//参数
lpPara=new lpInfo;
//开始监听
StartListen();
//微软不建议把CSocket对象作为参数传递,理由是容易出错。
//Detach()和Attach()传递套接字句柄,而不是传递CSocket实例本身
lpPara->s_socket.Attach(m_sListenSock.Detach());
*/
//创建一个监听线程
m_hListenThread=CreateThread(NULL,0,ListenProc,/*(LPVOID)(lpPara)*/this,0,&dwThread);
//创建线程信息结构体对象
threadInfo info;
info.s_dwThreadID=dwThread;
info.s_end=FALSE;
m_threadInfo.AddHead(info);
m_dListenID=dwThread; //OutputLastError();
}可以看到调用GetIP没问题,但调用StartListen函数报错拜托大家帮忙看看,谢谢了,很急啊!
现在是这个函数报错,函数是没问题的,不在线程里执行是可以实现的,但一旦在线程中执行就要报错。
void CMyDlg::StartListen()
{
InitVariable();
UpdateData(FALSE);
if(m_nSerCurState!=IsStart)
{
//MessageBox(m_cIP);
if(m_sListenSock.Create(m_nPort,SOCK_STREAM,m_cIP))//创建socket
{
m_cSerCurState=Enum2CString(IsStart);
MessageBox(m_cSerCurState);
if (!m_sListenSock.Bind(m_nPort,m_cIP))//将本地地址与socket绑定在一起
{
MessageBox("绑定失败!");
}
m_sListenSock.Listen(5);//开启监听
WSAAsyncSelect(m_sListenSock,GetSafeHwnd(),ACCEPT_EVENT,FD_ACCEPT|FD_READ|FD_CLOSE);//转变阻塞模式
//WSAAsyncSelect的返回值决定是否成功执行。此函数目的是将阻塞模式转为非阻塞模式,即执行完函数立即返回,若事件发生
//则通过消息告诉窗口,执行相应的函数
//m_bStarting=TRUE;//开始侦听了
}
OutputLastError();
}
UpdateData(FALSE);
}//监听线程
DWORD WINAPI ListenProc(
LPVOID lpParameter)
{
//开始监听
CMyDlg *dlg=((CMyDlg*)lpParameter);
dlg->StartListen();//调用StartListen函数报错
//AfxMessageBox(dlg->GetIP());调用GetIP函数就可以
return 0;
}void CMyDlg::OnBtnStart()
{
// TODO: Add your control notification handler code here
/*创建一个线程用于处理与客户端的数据交互*/
DWORD dwThread; /*lpInfo *lpPara;//参数
lpPara=new lpInfo;
//开始监听
StartListen();
//微软不建议把CSocket对象作为参数传递,理由是容易出错。
//Detach()和Attach()传递套接字句柄,而不是传递CSocket实例本身
lpPara->s_socket.Attach(m_sListenSock.Detach());
*/
//创建一个监听线程
m_hListenThread=CreateThread(NULL,0,ListenProc,/*(LPVOID)(lpPara)*/this,0,&dwThread);
//创建线程信息结构体对象
threadInfo info;
info.s_dwThreadID=dwThread;
info.s_end=FALSE;
m_threadInfo.AddHead(info);
m_dListenID=dwThread; //OutputLastError();
}可以看到调用GetIP没问题,但调用StartListen函数报错拜托大家帮忙看看,谢谢了,很急啊!
{
//MessageBox(m_cIP);
if(m_sListenSock.Create(m_nPort,SOCK_STREAM,m_cIP))//创建socket
{
m_cSerCurState=Enum2CString(IsStart);
MessageBox(m_cSerCurState);
if (!m_sListenSock.Bind(m_nPort,m_cIP))//将本地地址与socket绑定在一起
{
MessageBox("绑定失败!");
} m_sListenSock.Listen(5);//开启监听 当然这只是一个可能性,你最好把报错的堆栈附上来看看
m_cSerCurState=Enum2CString(IsStart);
你确定这个转换以后,m_cSerCurState == IsStart ?把m_cSerCurState换成BOOL变量,初始FALSEm_cSerCurState=Enum2CString(IsStart);改为m_cSerCurState = TRUE;
或者 ListenProc
改为
DWORD WINAPI ListenProc(
LPVOID lpParameter)
{
//开始监听
CMyDlg *dlg=((CMyDlg*)lpParameter);
if(dlg->m_nSerCurState!=IsStart)
dlg->StartListen();//调用StartListen函数报错
//AfxMessageBox(dlg->GetIP());调用GetIP函数就可以
return 0;
}