在C ++中设置ifstream超时?

我们试图从连接到一个linux盒子的2个usb鼠标读取数据(这个数据用于机器人的测距/定位)。 所以我们需要不断从每只鼠标读取它的移动量。 问题是,当一个鼠标没有移动,它不会发送任何数据,所以我们从中获取数据块的文件stream,因此程序不能做odometry计算(其中涉及时间测量的速度) 。

有没有办法在inputstream上设置超时(我们在C ++中使用ifstream并从/ dev / input / mouse中读取),以便我们能够知道鼠标何时不移动,而不是等待要收到一个事件? 或者我们需要搞砸线程(arggh …)? 欢迎任何其他build议!

提前致谢!

在linux中读取多个文件描述符的常用方法是使用select()。 我建议从manpage开始。 基本的系统流程如下:

1)初始化设备
2)获取设备文件描述符列表
3)设置超时
4)使用文件描述符和超时作为参数调用select – 它将阻塞,直到其中一个文件描述符上有数据或达到超时
5)确定为什么选择返回,并相应地采取行动(即在具有数据的文件描述符上调用read())。 您可能需要在内部缓冲读取结果,直到获取完整的数据文件。
6)循环回到4。

这可以成为你的程序主循环。 如果你已经有了一个不同的主循环,你可以在没有循环的情况下运行上面的代码,但是你需要确保函数被调用的足够频繁,这样你就不会丢失串口上的数据。 您还应该确保您的更新速率(即1 /超时)对于您的主要任务来说足够快。

选择可以在任何文件描述符上运行,例如网络套接字和通过文件描述符公开接口的其他任何东西。

你正在寻找的将是一个异步的方式来读取ifstream,如套接字通信。 唯一可以帮助的是readsome函数,如果没有可用的数据,可能会返回,但我怀疑这有助于。

使用线程将是处理这个问题的最好方法。

看看升压阿西欧图书馆 。 这可能会帮助你处理由schnaeder建议的线程。

不,没有这样的方法。 你将不得不等待一个事件,或创建一个自定义的Timer类,并等待超时重新加载,或使用线程。