//线程主函数(CSocketHunterDlg类static 成员函数)
UINT CSocketHunterDlg::ThreadConnect(LPVOID pParam)
{
CSocket CSocketConnect; CSocketConnect.Create(4321);//这行运行时出错 int iConnect = CSocketConnect.Connect("202.192.144.0",31432);
if( iConnect == 1 )
AfxMessageBox("连接成功");
else
AfxMessageBox("连接失败");
AfxMessageBox("线程结束");
return 0;//线程成功结束
}//线程测试按钮
void CSocketHunterDlg::OnDuoXianCheng()
{
MessageBox("开启线程");
AfxBeginThread(ThreadConnect,NULL,THREAD_PRIORITY_NORMAL);
}编译运行后,点击OnDuoXianCheng()按钮,弹出MessageBox显示“开启线程”,点击确定后立即出错,vc6显示 Unhandled exception in SocketHunter.exe: 0xC0000005:Access Violation.还尝试用过这两个函数CSocketConnect.Detach();CSocketConnect.Attach();但是都不得要领。请高手指教具体代码,谢谢。
UINT CSocketHunterDlg::ThreadConnect(LPVOID pParam)
{
CSocket CSocketConnect; CSocketConnect.Create(4321);//这行运行时出错 int iConnect = CSocketConnect.Connect("202.192.144.0",31432);
if( iConnect == 1 )
AfxMessageBox("连接成功");
else
AfxMessageBox("连接失败");
AfxMessageBox("线程结束");
return 0;//线程成功结束
}//线程测试按钮
void CSocketHunterDlg::OnDuoXianCheng()
{
MessageBox("开启线程");
AfxBeginThread(ThreadConnect,NULL,THREAD_PRIORITY_NORMAL);
}编译运行后,点击OnDuoXianCheng()按钮,弹出MessageBox显示“开启线程”,点击确定后立即出错,vc6显示 Unhandled exception in SocketHunter.exe: 0xC0000005:Access Violation.还尝试用过这两个函数CSocketConnect.Detach();CSocketConnect.Attach();但是都不得要领。请高手指教具体代码,谢谢。
解决方案 »
- 再问HTTP协议的问题?
- 如何响应windows系统开始菜单的消息??
- 就200分了,望高手笑纳。 关于activex控件实例的问题。
- 请问怎样通过在一个对话框中操作使另外一个基于CFormView的窗体的tree control控件中插入值?
- CString 怎样转换成 DWORD?
- 从VC6.0到VC.NET的问题,我在VC6.0下写的程序编译没什么问题,然后搬到VC.NET下来编译,怎么会出现一些错误:
- 在新开的线程里创建对话框出错!
- 哪位用过MSMQ编程,请大概讲解一下。
- 免费的图象软件
- 如何决定窗口的初始化大小和位置(不用MFC)?
- 弱弱的问VISUAL STUDIO.NET安装问题!
- 怎么将CBitmap中的位图直接copy到windows的剪贴板?
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
试一下
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return;
}
”后点击确定,调试器自动打开一个文件并来到这里:void* CMapPtrToPtr::GetValueAt(void* key) const
// find value (or return NULL -- NULL values not different as a result)
{
if (m_pHashTable == NULL)//黄色箭头来到这一行停住
return NULL; UINT nHash = HashKey(key) % m_nHashTableSize; // see if it exists
CAssoc* pAssoc;
for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext)
{
if (pAssoc->key == key)
return pAssoc->value;
}
return NULL;
}这个自动打开的文件是:"G:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\MAP_PP.CPP",我从来没有修改过MFC目录里面的任何文件。
......
句柄映射
MFC在把句柄封装成对象方面不遗余力,为了保证同一线程内对象<->句柄映射是一对一的,创建了各种各样的句柄映射,窗口,GDI对象,菜单诸如此类。为了封装GetDlgItem,SelectObject这样的API返回的临时的句柄,MFC还产生临时的对象<->句柄映射。句柄映射使得GetParentFrame这样的函数可以实现。.....
同样的,由于这些对象是被线程所拥有的,MFC的这些句柄映射的存储方式是线程局部存储(thread-local-storage ,TLS)。也就是说,对于同一个句柄,句柄映射中相应的对象可以不一致。这在多线程程序中会造成一些问题,参见微软知识库文章Q147578 CWnd Derived MFC Objects and Multi-threaded Applications。
http://support.microsoft.com/default.aspx?scid=kb;en-us;147578
全部放在主窗体线程里没问题还是放在独立worker线程里没问题?
http://support.microsoft.com/default.aspx?scid=kb;en-us;147578