gpt4 book ai didi

c++ - 是否可以为 std::cin 设置超时?

转载 作者:可可西里 更新时间:2023-11-01 15:18:24 28 4
gpt4 key购买 nike

是否可以为 std::cin 设置超时?例如,std::cin 在 10 秒内没有收到任何数据 - 它抛出异常或返回错误。

已编辑:

Boost 库 中的计时器呢?据我所知,它是可移植图书馆。是否可以要求 Boost 库的计时器在预定义的时间段后抛出异常?我想它可以解决这个问题。

最佳答案

无法以可移植的方式为 std::cin 设置超时。即使采用不可移植的技术,这样做也并非易事:您需要替换 std::cin 的流缓冲区。

在 UNIX 系统上,我会将 std::cin 使用的默认流缓冲区替换为使用文件描述符 0 读取输入的自定义流缓冲区。要实际读取输入,我会使用 poll() 来检测输入的存在并为此函数设置超时。根据 poll() 的结果,我要么读取可用的输入要么失败。然而,为了可能处理未转发到文件描述符的键入字符,关闭在输入换行符之前完成的缓冲可能是合理的。

当使用多线程时,你可以创建一个可移植的过滤流缓冲区,它使用一个线程来读取实际数据,另一个线程使用一个定时条件变量来等待第一个线程发出它接收到数据的信号或等待超时直到到期为止。请注意,您需要防止虚假唤醒,以确保在没有输入时确实达到了超时。这将避免修改从 std::cin 读取数据的实际方式,尽管它仍然替换 std::cin 使用的流缓冲区以使功能可访问通过这个名字。

关于c++ - 是否可以为 std::cin 设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9053175/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com