- 主题:请教socket编程如何保证响应的时效性
这样也不能绝对保证,如果在while循环之后,函数返回之前,有数据到达呢?还是会丢数据的。当然,如果数据包里面有序列号就好办,隔一段时间收一遍,把同样序列号的包组装到一起。我现在被别人定义了包结构,里面没有序列号。
【 在 hgoldfish 的大作中提到: 】
: 有 while (socket.bytesAvailabe() > 0) { socket.read(...); ... } 这样子。
:
--
FROM 113.70.91.*
牛,我还不是专职的程序员,这个对我来讲难度较大!
【 在 polarx 的大作中提到: 】
: 如果一定要用框架,我推荐你用ZMQ。感兴趣的话,可以自己写吧,C++不都是喜欢造轮子么。
--
FROM 185.212.57.*
那就是同步通信了,不是异步通信。
【 在 roy 的大作中提到: 】
: 这个很简单,没有readyRead的时候每隔50ms尝试读一次就好了
:
--
FROM 113.70.91.*
消费级的没问题,工业级的可靠性要求高的场合,问题很大。
【 在 gameplayer 的大作中提到: 】
: 方便的话还是贴下代码吧,这么常用的类,感觉不应该会有如此严重的问题
:
--
FROM 113.70.91.*
问题找到了,就是卡在readyRead的槽函数里面,当在槽函数里面执行的时候,有新数据到来,但这个新数据并不会再次有readyRead信号发出,后面的数据接收和处理程序就一直在傻等数据到齐,因而导致的通信超时。多线程的时候这种概率大,不搞多线程的时候没问题。
【 在 hongyan2022 的大作中提到: 】
: TCP 不保证通讯的高速
: 不过,100MS 太大了,感觉不大正常
:
--
FROM 113.70.90.*
肯定能干别的,要不然为什么搞多线程呀。比如我因为某个事务请求一次数据,那我不用傻等这个数据到来呀,我丢给数据处理线程等数据。然后我做其他事情,再请求一次或多次数据,请求完了都丢给数据处理线程。一旦某次请求的数据获得了,我就做相应的后续处理。这不就是要做多线程程序的原因嘛
【 在 dormouseBHU 的大作中提到: 】
: 你在工作线程中接收readyRead信号本质上也是阻塞模式,没有区别的。没有数据时,你的工作线程不也停在那吗?难道你的工作线程还能干别的?
: :
--
FROM 113.70.90.*
我的数据包里面没有序列号的(数据包的定义不是我定义的),如果是多线程程序,不能确保请求的数据按先后次序依次到来,即便是依次序到来的,如果有两次请求的数据夹杂在一起,我也无法哪个数据对应哪次请求。所以定时收数据的方式是不可行的。
【 在 roy 的大作中提到: 】
: 和同步异步有啥关系?在别的线程里用qtimer自动定时触发readReady对应的slot又不是什么难事
:
--
FROM 113.70.90.*
qt说他是多线程的,^_^
【 在 hgoldfish 的大作中提到: 】
: Qt 的 socket 模型是单线程的话,,你用多线程通常就错了。
:
--
FROM 113.70.90.*
高手,我搞半年没搞定!现在彻底放弃了readyReady信号,好了,隔5ms读一次,再也不乱了,哈哈
【 在 roy 的大作中提到: 】
: 和同步异步有啥关系?在别的线程里用qtimer自动定时触发readReady对应的slot又不是什么难事
:
--
FROM 113.70.89.*
TCP,QT的坑绝对多,现在又碰到个问题,QImageReader读图的时候,大于30M的BMP图片就读不进来了,直接返回NULL,服了,我还是64位程序。
【 在 iwantfly 的大作中提到: 】
: 你发送的是udp吧
: 用tcp就不会这样了
:
--
FROM 113.70.91.*