新手.关于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); 在这句话出现了错误
不知道是什么意思,请教大大们,求帮帮
展开
 我来答
空雪梦见
2013-12-12 · TA获得超过5598个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1200万
展开全部
因为没发现你的代码调用AsyncSelect的,所以这个方面我不好说什么。
我想说的是, (CThread*)AfxBeginThread(RUNTIME_CLASS(CThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); 这里,AfxBeginThread返回的是CWinThread*,而这个CWinThread*和CThread*的关系是前者是后者的父类,从一个父类这样转到子类,逻辑上来说是不行的。所以在pThread上直接或间接访问其成员变量甚至虚函数的时候,就可能产生溢出,读数据出现“未定义”的值,写数据的时候破坏其他内存块。
icelbja
2013-12-12 · TA获得超过138个赞
知道小有建树答主
回答量:180
采纳率:100%
帮助的人:152万
展开全部
呵呵又是你,楼上正解,AfxBeginThread返回一个指向CWinThread类的指针,也就是说AfxBeginThread函数创建了一个CWinThread对象(假如是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)
{

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式