winsock编程中的多线程
我用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




