c++ - 在 C++ 中的 ifstream 上设置超时?

标签 c++ linux input mouse

我们正在尝试从连接到 linux 盒子的 2 个 USB 鼠标读取数据(此数据用于机器人的测距/定位)。所以我们需要不断地从每只老鼠身上读取它移动了多少。问题是当鼠标不移动时,它不会发送任何数据,因此我们从中获取数据的文件流会阻塞执行,因此程序无法进行测距计算(涉及速度的时间测量) .

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

提前致谢!

最佳答案

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

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

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

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

关于c++ - 在 C++ 中的 ifstream 上设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/575070/

相关文章:

python - 如何在 Python 2 中从键盘获取用户输入?

c++ - 为什么 MS Visual Studio #include <stdio.h> 默认情况下在 stdafx.h 中?

linux - diff 程序中的 -Naur 是什么?

c++ - 使用指针时无限循环

linux - 动态加载带/不带版本号的共享对象

c - 从 linux 内核或 udev 监听硬件变化事件

javascript - 仅为输入日期最小/最大属性指定 YEAR 和 MONTH

html - 防止文本输入的水平 "scrolling"?

c++ - 默认写文件到桌面

c++ - FL_输入到字符串中