阻塞SOCKET通讯问题。(200分)

  • 主题发起人 主题发起人 zlbati9
  • 开始时间 开始时间
to张无忌:
你说的线程池是否指一次创建比如50个线程,初始状态为挂起。接收到数据时,竞争激活。
处理数据? 但接收...?
为什么异步的效率太低?
请问到底该怎样用线程池处理呢?
正注意听。


 
我说的就是你的理解的,中间用完成端口配合,
异步要进行用户和核心态的切换,消息队列的使用,效率不高,
我的有本书上有测试的,
 
阻塞式的效率很高,不需要进行消息处理,适合进行大量的数据传输,
 
to张无忌:
但线程池只是指对数据的处理。这并没有解决数据的接收问题。
不知道什么时候得到数据,显然是不能用同步的,创建一个TWinSocketStream ,不可能设置
永不超时的等待。那还是只能用异步接收。!?
异步要进行用户和核心态的切换 ? 核心态是指什么?谢谢
正注意听。
 
看情况,非阻塞最大的问题是可能出现响应不及时的问题,阻塞方式则响应会及时得多。
TServerSocket本身支持线程池功能(默认为10),只有超过线程池时才会新建线程。
线程没有工作时只要用Suspend挂起或用WaitForSingleObject等待事件时不会占用任何CPU时间。
最后:用阻塞方式时不可以用TWinSocketStream以外的任何方式进行通讯,包括SendBuffer
但用TWinSocketStream不是太方便,它只能用Read/Write(用ReadBuffer常会因为收到的数据不够而产生异常)
我从TWinSocketStream派生了一个类,提供了几个方便的函数,可以到我的主页看看:http://msrc.126.com
 
猛禽:在哪里,你说具体的路径吧。在那个栏目里面?
 
我说的线程池根本不用什么控件,都用WINSOCK API来写,配合完成端口,根本不存在你说的问题
还有用DELPHI提供的控件,效率太低了
 
用 winsock api, 使用 select 来监视 socket 套接字然后创建thread 或者是直接处理
客户机的连接

说老实的,我不大会用 delphi 的那些 socket 控件们 :(
 
控件只不过是对winsock api的一个封装,提供几个方便的外部接口。跟使用winsock api没有
任何本质的区别,区别只是形式。用不用控件,只是根据个人习惯和项目需要。
我们的营业后端处理程序一次同时起50个线程,有用户信息处理激活线程,使用CB提供的Socket控件,也没有
任何的问题。实时性也非常的好。
 
这是来自:DiamondKing的,也正是我想知道的。还请大家解答这个。正注意听。
to张无忌:
但线程池只是指对数据的处理。这并没有解决数据的接收问题。
不知道什么时候得到数据,显然是不能用同步的,创建一个TWinSocketStream ,不可能设置
永不超时的等待。那还是只能用异步接收。!?
异步要进行用户和核心态的切换 ? 核心态是指什么?谢谢
正注意听。
 
我是用WSARecv直接接收数据,不用DELPHI的VCL类,配合重叠I/O和Wait***object
处理,完全可以实现永久等待,但是这样不太好,一般是设置一个超时,超过这
个时间就断开连接。
 
to张无忌: 可不可以贴些代码出来?麻烦多些注释。 谢谢! 正注意听。
 
大家还有高见吗?还请继续讨论
 
没有讨论了吗?我现在是在可户端线程里建一个请求队列(一个成员变量),可户端主线程有请求时,写队列。
线程不断检测之,有就发请求。收数据也在线程里面,和以前一样。可能有些问题,
在我没找到好的方法前,就如此处理。

现在给分。
 
不好,操作失误,把分都给了DiamondKing!
实在对不起其他几位兄弟,特别是zhjwjan。不知可有方法补救。万望见谅!!!
 
zlbati9:请到以下路径去领回分数。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1216873
 
DiamondKing:谢谢,我已去了,麻烦你了。其余的朋友,我马上会再开帖给分的,不好意思!
 
其余的朋友,请到http://www.delphibbs.com/delphibbs/dispq.asp?lid=1217600
领分。再次感谢DiamondKing,不厌其烦的帮助。
 
后退
顶部