我试图在一个子线程施放一个CSocket对象,可是不行,为什末?

解决方案 »

  1.   

    CSocket只能在主线程中使用。不要使用mfc的类了.
      

  2.   

    CSocket可以在子线程中使用,但是在线程之间不能传递CSocket对象。
      

  3.   

    你将CSocket对象定义成全局的并在前面加上volatile试试,如
    volatile CSocket m_Svr;
      

  4.   

    我使用原始的套接字(不是CSocket),在多线程中使用就没有问题。
    但CSocket没有使用过。
      

  5.   

    这主要是CSocket的基类CAsyncSocket是异步模式,用窗口消息来通知Socket读写等事件,由于窗口的消息是线程内的,所以如果你切换到别的线程,CSocket会收不到消息,在PumpMessages中会用ASSERT(pState->m_hSocketWindow != NULL);发出异常,如果在Release版中编译就不会出现这样的问题,因为ASSERT只在DEBUG版中不起作用.除非CSocket类在建立的时候就在另一个线程中,不能一个CSocket对象跨越两个线程.这样会出现异常,其实MFC提供的CAsyncSocket和CSocket都不适合于多线程(我个人的认为).如果编写服务器程序可以用CAsyncSocket异步实现单线程方式,而CSocket是阻塞的(建立在非阻塞上的阻塞),所以建立只用来编写一些点对点的网络应用程序可以满足要求.如果要编写服务器多线程的网络程序建议自己建立Socket类.