peakzhang 发表于 2008-1-6 21:42:46

关于proactor框架的一个问题

大家好,我是初学者,在运用proactor框架传送文件时遇到一个问题。我在读事件的回调函数handle_read_stream中用for循环来每次读取文件中1024个字节的数据然后发送到对端,发送时每次都开了一个新的Message Block,原理上发送后会回调handle_write_stream释放掉这个Message Block,可是可能由于for循环太快的原故,这个Message Block可能未来得及释放,导致在传文件的过程中内存占用很高(越来越高),请问怎么解决这个问题?谢谢!

peakzhang 发表于 2008-1-6 21:42:52

对于这种费时的操作最好另开线程去处理

还有,handle_read_stream()和 handle_write_stream()一般是由同一个线程调用的,所以如果你的程序一直在handle_read_stream()中不出去,则handle_write_stream()就执行不到了;具休机制你可以看一下源ACE源码

peakzhang 发表于 2008-1-6 21:43:03

建议你读取文件后,推送到发送队列处理,对端收取消息队列进行接收。这个模式很常见,通用。

peakzhang 发表于 2008-1-6 21:43:16

我将循环读取文件并发送的部分放到了一个线程中,现在在本机上测试还可以,可是在局域网中测试时,传输较小的文件(几十兆)还可以正确完成,可下载几百兆的文件时,服务器端的PF使用率又占用很高,而且总是传输一会儿就不传输了(托盘那个网络连接图标灭了,一会儿又亮了,反正是不正确,最终服务器也会卡住)。我仔细检查了一下,感觉可能是因为传输速度的限制,而我的服务器端循环读取并发送的太快才导致PF使用率过高,那像这样的情况怎么来处理呢?我查了一下书,好像用ACE_Message_Queue类可以解决,但不知具体怎么使用,也不知我的想法是否正确?

peakzhang 发表于 2008-1-6 21:43:21

ACE内置的消息队列是很好的概念和实现,能实现流速控制,通过队列的大小和阻塞方式。

有例子程序,你最好直接读读C++网络编程第二卷的说明。
页: [1]
查看完整版本: 关于proactor框架的一个问题