新手.关于MFC网络编程线程的小问题
classCThread:publicCWinThread{...}classMySocket:publicCAsyncSocket{...}//函数中使用Thread{...
class CThread : public CWinThread
{
...
}
class MySocket : public CAsyncSocket
{
...
}
// 函数中使用Thread
{
...
CThread * pThread = (CThread*)AfxBeginThread(RUNTIME_CLASS(CThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (!pThread)
{
m_ServerSocket->Close();
TRACE("Could not create thread\n");
return;
}
pThread->hsocket = m_ServerSocket->Detach();
...
}
BOOL CThread::InitInstance()
{
// TODO: 在此执行任意逐线程初始化
if (!AfxSocketInit())
{
AfxMessageBox("Error");
return FALSE;
}
m_ServerSocket = new MySocket;
m_ServerSocket->Attach(hsocket);
return TRUE;
}
在上面这个函数结束后会出错,我设置了断点跟踪到下面代码
BOOL CAsyncSocket::AsyncSelect(long lEvent)
{
ASSERT(m_hSocket != INVALID_SOCKET);
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
ASSERT(pState->m_hSocketWindow != NULL);
return WSAAsyncSelect(m_hSocket, pState->m_hSocketWindow,
WM_SOCKET_NOTIFY, lEvent) != SOCKET_ERROR;
}
ASSERT(m_hSocket != INVALID_SOCKET); 在这句话出现了错误
不知道是什么意思,请教大大们,求帮帮 展开
{
...
}
class MySocket : public CAsyncSocket
{
...
}
// 函数中使用Thread
{
...
CThread * pThread = (CThread*)AfxBeginThread(RUNTIME_CLASS(CThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (!pThread)
{
m_ServerSocket->Close();
TRACE("Could not create thread\n");
return;
}
pThread->hsocket = m_ServerSocket->Detach();
...
}
BOOL CThread::InitInstance()
{
// TODO: 在此执行任意逐线程初始化
if (!AfxSocketInit())
{
AfxMessageBox("Error");
return FALSE;
}
m_ServerSocket = new MySocket;
m_ServerSocket->Attach(hsocket);
return TRUE;
}
在上面这个函数结束后会出错,我设置了断点跟踪到下面代码
BOOL CAsyncSocket::AsyncSelect(long lEvent)
{
ASSERT(m_hSocket != INVALID_SOCKET);
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
ASSERT(pState->m_hSocketWindow != NULL);
return WSAAsyncSelect(m_hSocket, pState->m_hSocketWindow,
WM_SOCKET_NOTIFY, lEvent) != SOCKET_ERROR;
}
ASSERT(m_hSocket != INVALID_SOCKET); 在这句话出现了错误
不知道是什么意思,请教大大们,求帮帮 展开
展开全部
因为没发现你的代码调用AsyncSelect的,所以这个方面我不好说什么。
我想说的是, (CThread*)AfxBeginThread(RUNTIME_CLASS(CThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); 这里,AfxBeginThread返回的是CWinThread*,而这个CWinThread*和CThread*的关系是前者是后者的父类,从一个父类这样转到子类,逻辑上来说是不行的。所以在pThread上直接或间接访问其成员变量甚至虚函数的时候,就可能产生溢出,读数据出现“未定义”的值,写数据的时候破坏其他内存块。
我想说的是, (CThread*)AfxBeginThread(RUNTIME_CLASS(CThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); 这里,AfxBeginThread返回的是CWinThread*,而这个CWinThread*和CThread*的关系是前者是后者的父类,从一个父类这样转到子类,逻辑上来说是不行的。所以在pThread上直接或间接访问其成员变量甚至虚函数的时候,就可能产生溢出,读数据出现“未定义”的值,写数据的时候破坏其他内存块。
展开全部
呵呵又是你,楼上正解,AfxBeginThread返回一个指向CWinThread类的指针,也就是说AfxBeginThread函数创建了一个CWinThread对象(假如是A)并返回其指针,但是这个对象中是没有hsocket 这个变量的。
你的CThread继承于CWinThread,所以CThread类里有所有的CWinThread的变量,但是CWinThread类里这里好比A里不会有你为CThread类添加的其他变量比如hsocket,虽然你把指针强制转换成CThread类型,但是指针还是没法在A这块内存上找到hsocket,因为A这块内存上根本没有hsocket所以肯定是错误的。
你的CThread继承于CWinThread,所以CThread类里有所有的CWinThread的变量,但是CWinThread类里这里好比A里不会有你为CThread类添加的其他变量比如hsocket,虽然你把指针强制转换成CThread类型,但是指针还是没法在A这块内存上找到hsocket,因为A这块内存上根本没有hsocket所以肯定是错误的。
追问
没办法.不太会啊.这个刚学的.还是新手
那就是说直接使用AfxBeginThread(RUNTIME_CLASS(CThread))就可以了?
还有就是线程工作区在哪?重载CWinThread::Run()函数?还是怎样?
追答
UINT Thread(LPVOID lparam);//声明线程函数。
AfxBeginThread(Thread,(LPVOID)A,0,0,0,0); //Thread就是线程函数的入口地址即函数名。A是你要传到带线程函数里的指针,即下面的lparam,可以是空。执行完这句话后下面的函数就回跑起来。
UINT Thread(LPVOID lparam)
{
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询