//线程主函数(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();但是都不得要领。请高手指教具体代码,谢谢。

解决方案 »

  1.   

    我试了多边 你这个没问题呀这句加了么?
    if (!AfxSocketInit())
    {
    AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
    return FALSE;
    }
      

  2.   

    你把前面加上一句WSAStartup
    试一下
      

  3.   

    WORD wVersionRequested;
    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;
    }
      

  4.   

    我把 xuanzg(小钢娃) 和 薄荷老大 的代码都分别加入到按钮里和线程里,但是都没有因为新加入的语句而符合“if并return”,情况和原来的一样。我不明白加入的语句的意思,薄荷老大的意思是查一下我的WinSock版本吗?我的机器是win2000 pro sp4、vc++6.0(未打任何补丁)。请问,CSocket是不支持线程的?我在用CSocket和CAsyncSocket这两个类,都吃了不少苦头,好像很多bug似的,不知道你们用起来怎样,在这样下去我打算放弃mfc了,可能直接学用winapi还更好一点,你认为怎样?
      

  5.   

    出现:“Unhandled exception in SocketHunter.exe: 0xC0000005:Access Violation.
    ”后点击确定,调试器自动打开一个文件并来到这里: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目录里面的任何文件。
      

  6.   

    http://www.csdn.net/develop/read_article.asp?id=23171
    ......
    句柄映射
    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
      

  7.   

    在worker线程中还是出错,但做在按钮里没问题,CSocket是继承CAsyncSocket的,在虚函数里要求消息机制,我猜测是worker线程中没有消息机制,对吗?有人给我一个确切回复吗?否则分数全给我的大米!
      

  8.   

    Re  zhengstar()
    全部放在主窗体线程里没问题还是放在独立worker线程里没问题?
      

  9.   

    我在连接时也没出现这个问题,但是当我使用Receive或Send时就会报不可读错。不知道为什么,我还没做什么工作?
      

  10.   

    也就是说,对于同一个句柄,句柄映射中相应的对象可以不一致。这在多线程程序中会造成一些问题,参见微软知识库文章Q147578 CWnd Derived MFC Objects and Multi-threaded Applications。
    http://support.microsoft.com/default.aspx?scid=kb;en-us;147578
      

  11.   

    不要在线程里创建对象,你的对象CSocketConnect生存期问题,试着在线程外new一个CSocket类对象,(记得自己清理掉)启动线程时传进去,然后再对此对象进行Send和Recv操作!
      

  12.   

    首先打上sp3以上,然后在工作线程开始处加上AfxSocketInit()就OK了
      

  13.   

    CSocket本来就会另外隐式创建一个窗口的,这样在跨线程下使用肯定有问题,而且此类对winsock API封装不好,还不如直接使用winsock api,多线程用没问题。