找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4014|回复: 4

关于proactor框架的一个问题

[复制链接]
发表于 2008-1-6 21:42:46 | 显示全部楼层 |阅读模式
大家好,我是初学者,在运用proactor框架传送文件时遇到一个问题。我在读事件的回调函数handle_read_stream中用for循环来每次读取文件中1024个字节的数据然后发送到对端,发送时每次都开了一个新的Message Block,原理上发送后会回调handle_write_stream释放掉这个Message Block,可是可能由于for循环太快的原故,这个Message Block可能未来得及释放,导致在传文件的过程中内存占用很高(越来越高),请问怎么解决这个问题?谢谢!
 楼主| 发表于 2008-1-6 21:42:52 | 显示全部楼层
对于这种费时的操作最好另开线程去处理

还有,handle_read_stream()和 handle_write_stream()一般是由同一个线程调用的,所以如果你的程序一直在handle_read_stream()中不出去,则handle_write_stream()就执行不到了;具休机制你可以看一下源ACE源码
 楼主| 发表于 2008-1-6 21:43:03 | 显示全部楼层
建议你读取文件后,推送到发送队列处理,对端收取消息队列进行接收。这个模式很常见,通用。
 楼主| 发表于 2008-1-6 21:43:16 | 显示全部楼层
我将循环读取文件并发送的部分放到了一个线程中,现在在本机上测试还可以,可是在局域网中测试时,传输较小的文件(几十兆)还可以正确完成,可下载几百兆的文件时,服务器端的PF使用率又占用很高,而且总是传输一会儿就不传输了(托盘那个网络连接图标灭了,一会儿又亮了,反正是不正确,最终服务器也会卡住)。我仔细检查了一下,感觉可能是因为传输速度的限制,而我的服务器端循环读取并发送的太快才导致PF使用率过高,那像这样的情况怎么来处理呢?我查了一下书,好像用ACE_Message_Queue类可以解决,但不知具体怎么使用,也不知我的想法是否正确?
 楼主| 发表于 2008-1-6 21:43:21 | 显示全部楼层
ACE内置的消息队列是很好的概念和实现,能实现流速控制,通过队列的大小和阻塞方式。

有例子程序,你最好直接读读C++网络编程第二卷的说明。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2025-2-23 14:29 , Processed in 0.018499 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表