如果有很多个客户端同时发数据,TldUDPServer控件的 OnUDPRead 事件怎么处理才能保证不丢包呀?(50分)

  • 主题发起人 主题发起人 coolingxyz
  • 开始时间 开始时间
C

coolingxyz

Unregistered / Unconfirmed
GUEST, unregistred user!
IdUDPServer控件有ThreadedEvent属性,是不是和这个有关,具体应该怎么做?
 
各位大虾请帮忙呀?????
 
这个恐怕没有办法。
 
可以这样,用一个队列作为BUFFER,当OnUDPRead这个事件的时候把数据放到队列中去,
响应这个事件只要做入队列的动作就行了。
然后专门开一线程对接收到的数据进行处理。
 
GoGo,能具体点说一下怎么实现吗?我接触 delphi不多呀,请指教。
 
申明一个TQUEUE类型的Buf
然后在OnUDPRead的时候申明一个String的指针,将所有Adata中的内容
读取到这个String指针指向的空间中,然后将这个指针压入队列中,
OnUDPRead事件就结束了。
在数据处理线程中循环的读取Buf.Count,如果队列非空,就执行Pop操作
将指针取出,访问指针的内容,处理数据就可以了。
 
建一个指针数组,每个成员设置一个BUF,根据请求的速度设置数组成员的个数
没收到一个消息,就把消息放到这个数组的一个成员里去,把这个成员的INDEX
POST出来,这样接受线程可以继续接受新的消息,而同时处理这个BUF数据的线程
可以继续运行,
 
现在我自己定义了一个缓冲数组,收到数据后马上标志一个可写的数组单元为正在写,
把数据放到数组中,标志这个数组单元为可读,后台一个线程不停的从头到尾扫描这个
数组,如果有可读的单元,标志为正在读,然后处理,处理完后标志为可写。继续扫描
其他单元。
 
和我的想法查不多,我建议你把哪个可以写的单元的位置做为一个全局变量,
后台线程始终读这个单元就行了
 
用一个EVENT触发这个读线程
 
这样不好吧,比如我在很短时间里收到了好几个包,
而后台线程第一个还没有处理完呢?那不是中间有几
个包没有处理就去处理后面的包了?
 
看,学习,
 
把这个值传给线程,线程用局部值保存他,处理完了以后就等待下一个事件,
而且你可以一个数组成员有一个线程负责处理缓存里的数据,这样效果就不
用我说了把
 
这样是不是同时要开很多个线程?

还有个问题,我现在是用了

while true do
begin
//处理数据
end;


这种方法来做的。还有其他的方法来让让线程不停的做这个动作吗?
 
用事件来管理线程,
 
还是不大清楚呀。要是事件产生的时候,线程没有处理完数据呢?
 
我原来的程序是把udp数据发送和接收放在主线程里的。我总觉得这样的话,
主线程还是不够灵活。

如果我要把udp数据发送和接收放在一个线程里,要怎么做呢。
要实现的功能:负责udp的线程,每隔一分钟发一个广播包,同时还要能响应
用户特殊的要求发送数据包,其他时间则不停监听是否有信息到达,如果到
达,就把数据放入缓冲中,并呼叫数据处理线程来处理。

问题是:负责udp的线程的 Execute 怎么来写。能让它不听的监听同时还要响
应用户消息,并每隔一段时间发送数据。

谢谢大家。分可以再加的。

要不大家看这个帖子。

http://www.delphibbs.com/delphibbs/dispq.asp?lid=1234221
 
我建议你哪个定时发包的部分专门写一个线程来做,这样稳定的多
 
发送和接收的线程分开吗?那发送和接收是用一个端口的吗?怎么协调?
 
后退
顶部