CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

winsock编程中的多线程

楼主Mactanald()2000-02-28 14:15:00 在 VC/MFC / 进程/线程/DLL 提问

我用winsock编程实现TCP/IP网络通讯,其中使用了多线程,但在线程中使用序列化时出现ASSERT错误,不知如何解决? 问题点数:50、回复次数:16Top

1 楼hayoo()回复于 2000-02-28 14:21:00 得分 0

用CRITICAL_SECTIONTop

2 楼forgettor()回复于 2000-02-28 16:42:00 得分 0

关注Top

3 楼xenogear()回复于 2000-02-28 16:49:00 得分 0

需要看源代码Top

4 楼WHQ()回复于 2000-02-28 16:56:00 得分 10

MFC对SOCKET的封装类不直接支持多线程,你不能在工作线程中读/写SOCKET,我的做法是用多线程处理客户的请求,处理完后通过向主窗口发送一自定义的消息把处理结果转到主线程发送出去。Top

5 楼netmare()回复于 2000-02-28 17:05:00 得分 0

如果你用CSocket就没有WHQ所说的情况,但用CAsyncSocket有可能出错,可以按WHQ的方法解决.Top

6 楼deepwater()回复于 2000-02-28 18:36:00 得分 10

我有过类似经历.  
  对于某些Windows资源如窗口,GDI,包括socket的Handle,MFC采用一个线程local的数据结构来保存他们,当你使用与之对应的CWnd,CDC,CSocket对象时,MFC会在这个线程local的数据结构中寻找对象的Handle.当你将一个CSocket对象的指针传到另一个线程中时,MFC在这个线程local的数据结构中找不到Handle,会产生ASSERT错误.  
   
  解决方法:  
  传递socket的Handle而非CSocket对象,然后将此Handle在第二线程中与创建在第二线程中的CSocket对象Attach即可.  
   
  It   will   work!Top

7 楼oo(为了名副其实,努力学习oo技术ing)回复于 2000-02-29 08:59:00 得分 0

请教deepwater,具体如何做?怎么attach?能不能麻烦你把关键的代码贴出来,谢谢!Top

8 楼deepwater()回复于 2000-02-29 10:15:00 得分 30

方法一   ==>   我用过的方法,繁点  
   
  我们需要用到CAsyncSocket的一个protected成员函数,所以我们得定义一个CAsyncSocket或CSocket派生类,比如叫   CMySocket,然后写这么个成员函数:  
   
  void   CMySocket::AttachSelf()  
  {  
          if(CAsyncSocket::LookupHandle(m_hSocket,FALSE)==NULL)  
              Attach(m_hSocket);  
  }  
   
  现在在第一线程中创建一个CMySocket对象pSock,再将这个指针传给第二线程,然后在第二线程中对这个指针调用  
        pSocket->AttachSelf();  
  现在你就可以在第二线程中尽情的使用创建于第一线程的pSocket了.  
   
  方法二   ==>   简单点,但未试过  
   
  不传递CAsyncSocket或CSocket对象指针,而传递socket   handle,然后再第二线程中用FromHandle(hSocket)得到一个临时CAsyncSocket对象.  
  思想类似,应该可行.  
   
  Tell   me   your   resultTop

9 楼liu_z_j()回复于 2000-02-29 10:33:00 得分 0

关注Top

10 楼oo(为了名副其实,努力学习oo技术ing)回复于 2000-02-29 11:08:00 得分 0

deepwater,非常感谢你。现在ok了。Top

11 楼deepwater()回复于 2000-02-29 11:19:00 得分 0

You   are   wellcomeTop

12 楼deepwater()回复于 2000-02-29 11:20:00 得分 0

方法二我自己也没试过.Top

13 楼Mactanald()回复于 2000-03-01 16:39:00 得分 0

首先感谢deepwater!使用你的方法二,我在第二线程中能正常进行序列化,但接下来,在第一线程中进行序列化时却出现与上次同样的错误,请问该如何解决?Top

14 楼deepwater()回复于 2000-03-01 18:12:00 得分 0

也许我需要你的代码Top

15 楼cnss(飞碟)回复于 2001-07-04 14:28:03 得分 0

关注Top

16 楼fmding(被劫的飞机)回复于 2001-10-08 21:54:58 得分 0

upTop

相关问题

  • winsock服务器端多线程编程
  • 多线程编程
  • 怎么在PB中进行多线程编程
  • C#的多线程编程
  • 多线程编程问题
  • 多线程编程问题!
  • Winsock多线程编程,用WSAEventSelect为何只收到一次FD_WRITE事件???
  • winsockAPI编程中的一个数据接收的多线程问题
  • 请高手指点rand()在多线程编程中的出现的怪病????
  • 在多线程编程中,为什么new不能跨越线程边界?

关键词

  • 线程
  • 多线程
  • 指针
  • 数据结构
  • 序列化
  • 解决
  • mfc
  • socket
  • csocket
  • casyncsocket

得分解答快速导航

  • 帖主:Mactanald
  • WHQ
  • deepwater
  • deepwater

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo