我用单线程执行,同样的程序,没有问题。
程序如下:
void COrderServerDlg::OnFileServer()
{
。
g_cListen->Create();
g_cListen->Listen();
//the up two lines are both success and g_cListen is a global socket
CWinThread* pThread = AfxBeginThread(ServerThreadProc, GetSafeHwnd(), THREAD_PRIORITY_NORMAL);
}
UINT ServerThreadProc(LPVOID pParam)
//it is global function
{.....
ntmpA = g_sListen->Accept(clientSocket,saClient,&nTmp);
....
}
程序如下:
void COrderServerDlg::OnFileServer()
{
。
g_cListen->Create();
g_cListen->Listen();
//the up two lines are both success and g_cListen is a global socket
CWinThread* pThread = AfxBeginThread(ServerThreadProc, GetSafeHwnd(), THREAD_PRIORITY_NORMAL);
}
UINT ServerThreadProc(LPVOID pParam)
//it is global function
{.....
ntmpA = g_sListen->Accept(clientSocket,saClient,&nTmp);
....
}
COrderServerDlg* ldlg = (COrderServerDlg*)pParam ;
ldlg->g_cListen->(...) ;
谢谢!
我的QQ12953091.
因为在CSOCKET创建时,已经与主窗口发生了关联(可看看MFC的源文件),如果主窗口已经销毁了,而ACCEPT函数还在检查主窗口是不是有效。
解决方法是:
1.创建用户线程,而非工作线程;
2.不使用CSocket类,而是自己使用Socket编程来实现.
说得很对呀!
你去看看《高级Windows编程》关于多线程方面的知识,里面阐述的比较清楚
它在内部实现了一个窗体,但是工作者线程没有什么窗体可言,所以
ASSERT就错了。作为替代,你可以在线程外生成Socket,将其hSocket
传递到线程中。