【问题标题】:Timeout for blocking function call, i.e., how to stop waiting for user input after X seconds?阻塞函数调用超时,即X秒后如何停止等待用户输入?
【发布时间】:2016-03-10 13:08:50
【问题描述】:

当要求用户输入时,我们需要调用一个阻塞函数,但我希望能够在指定的超时时间过去(通常是几秒钟)后“解除阻塞”并恢复。

我该怎么做?

std::string s;
// blocking function call
std::cin >> s; // how can I resume operation after timeout duration has elapsed?

【问题讨论】:

标签: c++ io timeout


【解决方案1】:

您无法按照自己的梦想行事,至少在标准 C++11 中不会(仅使用标准化的C++11 函数)。您实际上需要一些operating system 支持,并且您隐含地需要一些event loop(或使用一些多threading 方法)。

但是,您可以使用您的操作系统工具和/或一些外部库。

FWIW,Linux 有多路复用syscalls 例如poll(2)(我确信 Windows、Android、MacOSX ......也有类似的东西);但您最好使用 ncursesQtSFML 之类的库(另请参阅 POCO 框架)。

细节比您想象的要复杂得多,并且是特定于操作系统的(但有些库是在多个操作系统上工作的框架)。另请参阅thisthat 答案并阅读tty demystified 页面。请注意,“terminal”在今天通常是一些抽象的虚拟设备,但在过去是一个复杂的设备(今天主要是模拟的)。

别忘了cin 可能不是终端。它可能是(特别是在 POSIX 系统上)pipe(7)(命令pipeline)或文件(redirection)。那么等待 5 秒可能毫无意义或无用。

【讨论】:

    【解决方案2】:

    您可以使用main() 编写一个程序,该程序使用fork() 函数创建两个进程,例如process1()process2()

    process1() 中输入用户表单。

    如您所说,在process2() 中延迟X 秒,然后通过进程2 终止进程1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 2012-01-24
      • 2011-05-23
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      相关资源
      最近更新 更多