【问题标题】:Setting a timeout on ifstream in C++?在 C++ 中设置 ifstream 超时?
【发布时间】:2026-02-13 17:00:02
【问题描述】:

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

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

提前致谢!

【问题讨论】:

    标签: c++ linux input mouse


    【解决方案1】:

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

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

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

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

    【讨论】:

    • +1,select() 是要走的路,因为它避免了多线程带来的头痛。
    【解决方案2】:

    您正在寻找的是一种从 ifstream 中读取的异步方式,例如套接字通信。唯一可以提供帮助的是 readsome 函数,如果没有可用数据,它可能会返回,但我怀疑这是否有帮助。

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

    【讨论】:

      【解决方案3】:

      看看boost Asio library。这可能会帮助您处理 schnaeder 建议的线程。

      【讨论】:

        【解决方案4】:

        不,没有这样的方法。您必须等待事件,或创建自定义 Timer 类并等待超时重新轮询,或使用线程。

        【讨论】: