• 4974阅读
  • 9回复

[提问]tcp网络编程接收数据 多线程问题 [复制链接]

上一主题 下一主题
离线jxhxfen2008
 

只看楼主 倒序阅读 楼主  发表于: 2013-03-14
需要接收服务器发送过来的数据
服务器每隔一段时间发送一下。


处理一次数据这个我到会。但是它每隔一段时间发一次就不会了。我这边没处理完,它就发送过来了,怎么办?


我的思路是开两个线程。一个用来接收数据暂存,一个用来读入进行处理。可这样的话,如果第一条数据还没有处理完,第二条数据和第三条。。。都已经发过来了,该怎么办呢??

如果数据发过来,我没及时接收,会不会丢失呢??然后阻塞啥的?


离线pxiao_xiao

只看该作者 1楼 发表于: 2013-03-14
最简明的用runnable 和 threadpool 处理
离线jxhxfen2008

只看该作者 2楼 发表于: 2013-03-14
引用第1楼pxiao_xiao于2013-03-14 11:56发表的  :
最简明的用runnable 和 threadpool 处理

runnable貌似没这个函数?
如果数据发过来,我没及时接收,会不会丢失呢??然后阻塞啥的?
离线pxiao_xiao

只看该作者 3楼 发表于: 2013-03-14
QRunnable 重写run() 里面包含一个你处理数据的继承了QObject类的子类策略对象
接收就那么接收好了
离线roywillow

只看该作者 4楼 发表于: 2013-03-14
我印象中,tcp socket接收到数据后,会发出一个信号,然后在这个信号连接的槽中进行数据的处理
但是在这个槽执行过程中,socket是不会再发出新的一个接收到数据的信号的,也就是说这个槽不可能同时执行两个
执行完这个槽,你才有机会去接收下一个信号,进行下一次处理
而这一次处理有可能是server发出的好几次数据的积累
所以说我觉得不用去担心这次没处理完,下次的数据就来了,顺序不会乱的,一个一个处理;除非一次处理非常耗时,可能需要多线程
要使用多线程的话……那就得自己去协调处理结果了……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线pxiao_xiao

只看该作者 5楼 发表于: 2013-03-14
看了你日志 也没看出啥
如果一次数据处理没结束 后面的数据又来要处理 就定义线程池来处理数据
如果你仅存在一个接收线程 包的顺序问题是不存在的 但提交给线程池处理的时候给每个包一个序号 因为线程池里谁先被处理完就不知道了
离线jxhxfen2008

只看该作者 6楼 发表于: 2013-03-15
引用第4楼roywillow于2013-03-14 20:51发表的  :
我印象中,tcp socket接收到数据后,会发出一个信号,然后在这个信号连接的槽中进行数据的处理
但是在这个槽执行过程中,socket是不会再发出新的一个接收到数据的信号的,也就是说这个槽不可能同时执行两个
执行完这个槽,你才有机会去接收下一个信号,进行下一次处理
而这一次处理有可能是server发出的好几次数据的积累
所以说我觉得不用去担心这次没处理完,下次的数据就来了,顺序不会乱的,一个一个处理;除非一次处理非常耗时,可能需要多线程
.......

处理完一个,如果其中服务器多发,就是说下一次的积累。那岂不是我不能分开是第几次发送的???
离线jxhxfen2008

只看该作者 7楼 发表于: 2013-03-15
引用第5楼pxiao_xiao于2013-03-14 21:58发表的  :
看了你日志 也没看出啥
如果一次数据处理没结束 后面的数据又来要处理 就定义线程池来处理数据
如果你仅存在一个接收线程 包的顺序问题是不存在的 但提交给线程池处理的时候给每个包一个序号 因为线程池里谁先被处理完就不知道了

找到原因了,一个低级错误。
我现在就是接收一台服务器的数据。你的想法和楼上的那位矛盾了?如果第一次数据没有全部接收,是不是就丢失了
离线jxhxfen2008

只看该作者 8楼 发表于: 2013-03-15
引用第4楼roywillow于2013-03-14 20:51发表的  :
我印象中,tcp socket接收到数据后,会发出一个信号,然后在这个信号连接的槽中进行数据的处理
但是在这个槽执行过程中,socket是不会再发出新的一个接收到数据的信号的,也就是说这个槽不可能同时执行两个
执行完这个槽,你才有机会去接收下一个信号,进行下一次处理
而这一次处理有可能是server发出的好几次数据的积累
所以说我觉得不用去担心这次没处理完,下次的数据就来了,顺序不会乱的,一个一个处理;除非一次处理非常耗时,可能需要多线程
.......

还有,继续问一下:谢谢


一。要是我接收一次数据只接收一部分,处理完毕,是不是接下来就丢失,直接扔掉了,等下一次ReadyRead(),接收的就是第二次的数据了??


二。还有一种情况,数据不符合要求,我返回return。这样是不是算处理完第一次的数据,然后等下一次ReadyRead(),接收的就是第二次的数据了??
离线hcu5555
只看该作者 9楼 发表于: 2013-03-22
用线程锁啊。。。一般不都可以吗?
快速回复
限100 字节
 
上一个 下一个