用Settimer方法读取高速数据的问题
Problem with High speed data read with Settimer method
我使用的是FIFO模式下的ftdi芯片和D2xx驱动程序的硬件。对于不同的设置,硬件以19.5KHz到312.5 KHz的速率发送数据字节。所以我的应用软件(mfcc++)应该以不同的速度读取这些字节。我使用Settimer和Ontimer方法,值为10毫秒,所以每10毫秒我读取数据字节,并在Ontimer函数中做一些处理。我的问题是
1>与settimer方法不同的系统给出不同的结果,即使两个系统都是XP SP3。一个系统正在读取所有字节,没有丢失任何数据,但在另一个系统中,数据会丢失,那么这个定时器是依赖于操作系统还是系统硬件?
2>据我所知,我可以为settimer设置的最小值是10毫秒,所以每10毫秒我可以读取数据。如果我不读快,会有溢出的驱动程序缓冲区,我无法控制。所以我可以读得更快在微秒或纳秒与任何计时器方法或有任何其他方法?请给我提个建议……提前感谢
在单独的线程中阻塞Read()
可能会更可靠。
SetTimer()
仅用于低分辨率工作。它的分辨率实际上可以根据最新版本的Windows的电源设置来缩小。
如果你想要高分辨率的定时器,定时器队列或多媒体定时器(具体来说,timeSetEvent()
)是走的路,这两者都可以有一个分辨率低至1ms
SetTimer的问题是,你将得到定时器通知不早于你设置的时间,但你不能保证它会在你设置的确切时间。
首先,取决于系统的计时器分辨率,通常为15毫秒。因此,即使您设置10毫秒,它也会在15毫秒(或更长时间)时滴答。
第二,当没有更多的消息要处理时发送定时器通知。因此,在消息循环中,当队列中没有更多消息时,系统会查看是否设置了计时器,以及它是否已打勾。如果有,它会发送一个通知。问题是,如果您的程序忙于做其他事情,它可能会丢失一个或多个"tick",并将它们"分组"到一个通知中,这种情况可能发生在75毫秒。
底线是SetTimer不是高分辨率需要的可靠计时器方法。
所以你可能不得不考虑其他的解决方案,比如一个单独的线程来读取。
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- HDF5Cpp 扩展复合数据集超板问题
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 我对数据结构、双向链表有一些问题
- 使用蓝牙组件将数据从Android手机传输到串行设备时出现问题
- Java 客户端C++服务器数据发送/接收问题
- printf 数据类型说明符复杂问题
- 从文件导入数据时遇到问题.我有一个没完没了的循环
- 对于这个问题,是否有更好的数据结构和算法选择
- 使用SSE内部函数复制少量数据时出现问题
- 面临在 if 语句之外打印变量数据的问题 完成使用 Qt 编程
- 面对迭代矢量<矢量<string>>和打印数据的问题
- C++中从客户端到服务器的数据传输问题
- 将此类数据作为字符串进行比较时出现问题
- 线程清理器检测到数据争用,问题出在哪里?
- 二叉搜索树插入数据问题
- 最近点对O(nlogn)算法——c++实现中的一些数据问题
- QTWebsocket / jwebsocket大数据问题
- Qt 5.5 QOpenGLTexture复制数据问题