副线程中无法操作在主线程中创建的CSocket对象
编号:QA003230
建立日期: 2000年8月1日 最后修改日期:2003年7月19日
所属类别:
Q
Boris:
操作系统:Win98/NT/2000
编程工具:VC 6.0
问题:如何在多线程的程序中使用CSocket
我在主线程(CWinapp的那个)中调用了AfxSockInit,但在副线程(AfxBeginThread的那个)中无论是否调用AfxSockInit都无法操作在主线程中创建的CSocket(断言错 如:Sockcore.cpp line:336)
VC 6.0 Dialog工程 with Afxsocket support
水平: 中级
A回答:
zhangzy的意见:
Easy.
1.在主线程中使用AfxSockInit,次线程中不需要使用AfxSockInit。
2.在次线程中不能直接操作主线程的 CSocket对象(或者有办法,俺不知道)。
3.应该把主线程的Socket handle 在次线程启动之前传递给次线程。
建议次线程使用一个CSocket类来接收这个Handle,这样在次线程中就可以方便地使用CSocket类了。
4.必须注意的是:传递handle需要使用Detach函数,接收handle 要使用Attach函数(大概的名字,记不清了)。
5.建议查看MSDN找一个例子来看,应该说是比较简单的(仅仅到这一步)。
6.OK,按以上思路应该能完成任务。但编译为Release版本后执行要出错的。
你得从MS那找个补丁办法解决。或者就使用DEBUG版吧。(微软的MFC类库中的虫子太多!这几天闹得我睡不着觉)
hlf的意见:
其实在Windows中一个线程之所以不能访问其它线程中创建的Socket,主要是由于使用了基于消息驱动的网络事件通知架构,而MFC中的CSocket所使用的正是这种架构。我们知道Windows中的任何一个消息都是线程级的,Socket的通知消息也不例外,当网络事件发生后(例如:FD_READ)消息将发送给调用WSAAsyncSelect函数的那个线程(对于accept接受到的Socket则是执行accept的线程),所以理所当然应该一个Socket就只能在本线程中使用!要想在另外的线程中使用,则必须使用在该线程中重新对该Socket调用WSAAsyncSelect函数(MFC中的Attach函数也要调用此函数)。
对于使用的MFC的情况,就得用‘zhangzy’讲的那种方法,现在原线程中Detach,然后再在目标线程中Attach(其实这是因为MFC类库内部维护了一系列线程局部对象的原因)。
s_w_y的意见:
一般来说线程之间不能共享数据。所以要在另外的线程中使用主CSocket,需要在开始副线程时将其作为参数传递给副线程。
此问题由zhangzy等回答。
附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, Internet编程, INET, www, internet, ie。
| |
|
|
| |
|
|