我想,1。你把CSocket放在函数中在栈上建立,会不会把Handle传给线程了,但是函数结束后,那个Handle又无效了呢,试着在堆上建立看看
2。我觉得不应该在InitInstance上把这个Handle Attach上去,虽然你的线程是Suspend方式建立的,可是我查了一下msdn也不知道建立线程的时候,InitInstance是不是先执行了的。所以,最安全的办法还是发消息给线程的消息循环,然后再在消息中把Socket的Handle传递过去一点浅见,不知道对不对,请指正
2。我觉得不应该在InitInstance上把这个Handle Attach上去,虽然你的线程是Suspend方式建立的,可是我查了一下msdn也不知道建立线程的时候,InitInstance是不是先执行了的。所以,最安全的办法还是发消息给线程的消息循环,然后再在消息中把Socket的Handle传递过去一点浅见,不知道对不对,请指正
而且最好不要用MFC那些破类,尤其在多线程方面,SDK编出来反而简洁容易调试。
甚至我觉得CSOCKET也不如直接用SDK简单。
to lgs请说明问题是什么。cc是td的成员变量类型为CSocket派生的类
在debug模式下运行一点问题也没有
不要将SOCKET的HANDLE进行传递
我试过如果传递很容易在RELEASE方式下出错(特别是在线程中)
HANDLE.
我源程序都贴出来了。你说没问题就帮我解决呀。把你的解决方法贴出来好吗?
你知道是在哪几种情况下出错吗?研究研究
调用AfxBeginThread(),和CreateThread()都会立马运行InitInstance()函数
应该传socket的句柄,而不是指针.传指针的话,在多线程且并发度较高的情况下,会出问题的.
而且,各位,在Debug下运行无误
一切都OK了。本人觉得CSocket、CAsyncSocket在多线程时有点问题,在单线程下没有
这些问题,也不想去研究,反正现在是不用这两个类了,直接用API,编程又简洁,控制
又直接。
void CVideoSvrDoc::ProcessPendingAccept()
{
CMainFrame * pMainWnd;
pMainWnd=(CMainFrame *)::AfxGetMainWnd(); CClientSocket Socket(this);
if (pMainWnd->m_pSocket->Accept(Socket))
{
CString PeerAdd;
UINT PeerPort;
Socket.GetPeerName(PeerAdd,PeerPort);
CString strTmp;
strTmp.Format("有客户端连接,已建立连接,地址:"+PeerAdd+"端口:%d",PeerPort);
WriteToLog(strTmp,SERVERLOGTYPE);
#ifdef _DEBUG
OutMsg(strTmp);
OutMsg("套接字为:%d",Socket.m_hSocket);
#endif
}
else
{
//delete pSocket;
WriteToLog("接受连接出错",ERRORLOGTYPE);
return;
} CConnectThread* pThread = (CConnectThread*)AfxBeginThread(RUNTIME_CLASS(CConnectThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (!pThread)
{
Socket.Close();
TRACE("Could not create thread\n");
return;
} pThread->m_hSocket =Socket.Detach();
pThread->m_pDoc=this; pThread->ResumeThread();
}在CConnectThread中定义了下面几个变量:
public:
SOCKET m_hSocket;
CClientSocket * m_pSocket;// Operations
public:
CSvrDoc * m_pDoc;//
BOOL CConnectThread::InitInstance()
{
//::PostMessage(AfxGetApp()->m_pMainWnd->m_hWnd, WM_THREADSTART, 0,0);
m_pSocket=new CClientSocket(m_pDoc);
m_pSocket->Attach(m_hSocket);
m_pSocket->m_pThread = this;
CreateSocketInformation(m_pSocket);//建立有关该连接的一些信息
return TRUE;
}
然后再自己根据需要用API写,控制起来直接方便好多.
I am use MFC in STATIC library!
改成动态的就正常了,同志,这就是微软。