QT 一个线程内多个定时器间的运行方式

QT 单线程内多个定时器间的运行方式

问题描述

最近在做项目,多客户机与服务器之间使用TCP协议进行数据传送,服务器开启多个定时器对多客户机的数据进行处理,多客户机需要向服务器发送大量数据,在测试时只使用了一台客户机频繁向服务器发送数据,但总是出现发送延时的问题。随后对程序代码进行检查,“以为”没问题,但问题却总是存在。随后写了一个简单的测试程序(只管接受数据,不做任何处理),发送延时的问题反而消失了。
若进行多客户机测试,且客户机定时向服务器发送数据,则会出现数据丢包的情况。why?请往下看

原因分析

一、TCP协议分析

TCP通过流量控制与拥塞控制来实现可靠稳定的传输。在本项目中,由于客户机向服务器发送了大量数据,而服务器在主线程内又开启多个定时器对数据进行处理。意味着服务器主线程需要完成多个任务:一是接受与客户机通信的套接字的数据,二是处理定时器的任务。由于任务多,因此服务器(慢机)处理能力相对客户机(快机)慢,导致服务器套接字的read缓存区随时处于满的情况,由于TCP的流量控制,客户机的发送速度被迫降下来,因此出现发送延时现象。

二、定时器分析

在一个主线程内创建了多个定时器,定时器使用时注意其两个特性:1、定时器之间不是并行处理数据,而是分片占用主线程资源 ,且定时器完成其对应的slot函数任务后,下一个定时器才会开始执行其slot函数任务;2、当定时器的间隔时间小于其slot函数任务的执行时间时,一旦定时器timeout时,其slot函数不会终止执行,只是暂停,内部变量仍然保存,而后继续执行。因此服务器接收套接字数据的任务与多定时器的任务互相掣肘,导致服务器处理数据能力下降。
有兴趣的可以参照我的思路去验证:主线程内开启多个定时器,执行同类任务,只是任务完成时间不一样,在中间同个节点打印信息,若定时器同时输出该信息,则表明定时器是并行处理任务,将定时器的间隔设置明显低于任务时间,在任务的中间节点和终点打印信息,若两者都打印信息,则说明定时器的slot函数不是反复终止执行当timeout时再重新启动。
我验证的代码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、若进行多客户机测试,且客户机定时向服务器发送数据,则会出现数据丢包的情况。

通过一、二的分析,答案已经很明显了,多客户机定时向服务器发送数据时,由于TCP的流量控制,服务器套接字的read缓存区会将客户机发来的导致read缓存区溢出的数据包丢掉。

不足之处,恳请斧正,共同进步!

  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值