2009-02-22 19 views
2

我们正在尝试从连接到Linux盒的2个USB鼠标读取数据(该数据用于在机器人上进行测距/定位)。所以我们需要不断从每只鼠标读取它的移动量。问题是,当鼠标没有移动时,它不会发送任何数据,所以我们从中获取数据块的文件流以及程序无法进行odometry计算(这涉及时间测量的速度) 。在C++中设置ifstream超时?

是否有一种方法可以在输入流上设置超时(我们在C++中使用ifstream并从/ dev/input/mouse读取),以便我们能够知道鼠标何时不移动,而不是等待一个事件被接收?或者我们需要搞砸线程(arggh ...)?欢迎任何其他建议!

提前致谢!

回答

-1

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

1

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

使用线程将是处理此问题的最佳方法。

5

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

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

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

Select可以对任何文件描述符进行操作,例如网络套接字和通过文件描述符公开接口的任何其他文件描述符。

+0

+1,select()是要走的路,因为它避免了多线程引起的头痛。 – 2009-02-22 16:38:16