Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Settimer方法读取高速数据时出现问题_C++_Mfc - Fatal编程技术网

C++ 使用Settimer方法读取高速数据时出现问题

C++ 使用Settimer方法读取高速数据时出现问题,c++,mfc,C++,Mfc,我使用的硬件ftdi芯片在先进先出模式和D2xx驱动我的工作。硬件以19.5KHz至312.5KHz的速率发送数据字节,用于不同的设置。所以我的应用软件(MFC++)应该以不同的速度读取这些字节。我使用Settimer和Ontimer方法,值为10毫秒。所以每10毫秒我读取数据字节,并在Ontimer函数中进行一些处理。我的问题是 1> 使用settimer方法,不同的系统给出不同的结果,即使两个系统都是XP SP3。一个系统正在读取所有字节,但另一个系统将丢失数据。那么这个定时器是依赖于操作系

我使用的硬件ftdi芯片在先进先出模式和D2xx驱动我的工作。硬件以19.5KHz至312.5KHz的速率发送数据字节,用于不同的设置。所以我的应用软件(MFC++)应该以不同的速度读取这些字节。我使用Settimer和Ontimer方法,值为10毫秒。所以每10毫秒我读取数据字节,并在Ontimer函数中进行一些处理。我的问题是

1> 使用settimer方法,不同的系统给出不同的结果,即使两个系统都是XP SP3。一个系统正在读取所有字节,但另一个系统将丢失数据。那么这个定时器是依赖于操作系统还是系统硬件

2> 据我所知,我可以为settimer设置的最小值为10毫秒,因此每10毫秒我可以读取数据。如果我读取速度不快,则驱动程序缓冲区中会出现溢出,我无法控制。因此,我可以使用任何计时器方法在微秒或纳秒内读取更快的数据,还是有其他方法?
请给我一些建议。。。提前感谢

在单独的线程中继续阻塞
Read()
,可能会更可靠

SetTimer()
仅用于低分辨率工作。它的分辨率实际上可以根据最新版本Windows中的电源设置进行缩小


如果您需要高分辨率计时器,或者(特别是,
timeSetEvent()
)是一种方法,两者的分辨率都可以降低到1ms。

SetTimer的问题是,您将在设置的时间之前收到计时器通知,但您不能保证它正好在您设置的时间

首先,您取决于系统的计时器分辨率,通常为15毫秒。因此,即使您设置为10毫秒,它也会以15毫秒(或更高)的频率滴答作响

其次,当没有更多的消息要处理时,会发送计时器通知。因此,在消息循环中,当队列中没有更多消息时,系统会查看是否设置了任何计时器,以及是否已勾选。如果有,则发送一个通知。问题是,如果您的程序忙于做其他事情,它可能会丢失一个或多个“滴答声”,并在一个通知中“分组”它们,这可能发生在75毫秒

底线是SetTimer对于高分辨率的需求不是一种可靠的计时器方法

因此,您可能需要查看其他解决方案,例如一个单独的线程来进行阅读。

这里更好地解释了这一点(请参阅WM_TIMER部分)