怎么保证不漏掉任何一个包并且还要不耽搁接收包的时间
如何保证不漏掉任何一个包并且还要不耽搁接收包的时间?
写一个统计Bluetooth传输速率的小工具,最后要将传输速度以曲线的方式显示在界面上(x轴为时间,y轴为传输速度)。
初步想法如下:
开一个线程A,专门负责收包:
再开一个线程B,负责计算每秒钟收到了多少字节
上面的设计存在一点问题:
ThreadB while(1)中有每次获取当前时间并比较的动作,它会占用时间,这样问题1的地方肯定会漏掉一些数据包,导致计算的值会比1s中实际接收到的字节数小。
上面的设计要怎样修改一下才能解决这个问题呢?
恳请指点迷津,万分感激。
另外祝福大家国庆节快乐!
------解决方案--------------------
不太明白
为什么不在ThreadA里面做数据计数的叠加工作
ThreadB读取这个值显示出来?
------解决方案--------------------
线程A进行收到数据的计数叠加
线程B利用sleep,每次sleep1秒,然后就把计数清零并画图。就不存在你这个问题了
只是对这个计数进行操作的时候记得加锁
------解决方案--------------------
求平均值不行吗?4s计算一次
------解决方案--------------------
我的意思是在ThreadA里面只叠加nRecvBytesPerSecond,1秒的判断和清零同样在ThreadB中进行
nRecvBytesPerSecond作为32位数据写入肯定是原子的,所以不需要加锁,但要设置为volatile
------解决方案--------------------
------解决方案--------------------
RTSP
------解决方案--------------------
threadb没事的时候sleep一下。
------解决方案--------------------
确实.你这while里没一个地方Sleep 所以cpu很消耗.
写一个统计Bluetooth传输速率的小工具,最后要将传输速度以曲线的方式显示在界面上(x轴为时间,y轴为传输速度)。
初步想法如下:
开一个线程A,专门负责收包:
- C/C++ code
ThreadA(__int64 *nRecvBytesPerTime) { *nRecvBytesPerTime = recv(); }
再开一个线程B,负责计算每秒钟收到了多少字节
- C/C++ code
ThreadB(__int64 *nRecvBytesPerSecond ) { time1; while(1) { if( (currenttime - time1) < 1s) { *nRecvBytesPerSecond += nRecvBytesPerTime;//问题1 } else { 画图(); *nRecvBytesPerSecond = 0; time1 = currenttime ; } } }
上面的设计存在一点问题:
ThreadB while(1)中有每次获取当前时间并比较的动作,它会占用时间,这样问题1的地方肯定会漏掉一些数据包,导致计算的值会比1s中实际接收到的字节数小。
上面的设计要怎样修改一下才能解决这个问题呢?
恳请指点迷津,万分感激。
另外祝福大家国庆节快乐!
------解决方案--------------------
不太明白
为什么不在ThreadA里面做数据计数的叠加工作
ThreadB读取这个值显示出来?
------解决方案--------------------
线程A进行收到数据的计数叠加
线程B利用sleep,每次sleep1秒,然后就把计数清零并画图。就不存在你这个问题了
只是对这个计数进行操作的时候记得加锁
------解决方案--------------------
求平均值不行吗?4s计算一次
------解决方案--------------------
我的意思是在ThreadA里面只叠加nRecvBytesPerSecond,1秒的判断和清零同样在ThreadB中进行
nRecvBytesPerSecond作为32位数据写入肯定是原子的,所以不需要加锁,但要设置为volatile
------解决方案--------------------
------解决方案--------------------
RTSP
------解决方案--------------------
threadb没事的时候sleep一下。
------解决方案--------------------
确实.你这while里没一个地方Sleep 所以cpu很消耗.