是否有可能在指定的时间后绕过std::cin

Is it possible to bypassing std::cin after a specified amount of time?

本文关键字:std cin 时间 有可能 是否      更新时间:2023-10-16

我正在寻找一种在X秒后跳过用户输入的方法。

类似:

 std::cout << "Enter a number n";
 timer(5000)
 {
      std::cin >> number;
 }
 //the rest of the program.

这样的东西存在吗?

我很确定没有任何东西是接近便携的。对于这个问题,可能没有什么可以直接与iostreams一起工作。

如果你想在Windows上使用它,你可以直接使用控制台API。特别是,您可以在标准输入句柄上使用WaitForSingleObject,并给出一个超时:

HANDLE standard_input = GetStdHandle(STD_INPUT_HANDLE);
if (WaitForSingleObject(standard_input, 5000) == WAIT_OBJECT_0)
    // read what the user entered
else
    // timed out (or otherwise failed).

不完全是这样:即使这个输入在一个单独的线程上执行,operator>>()也不是一个取消点。

但是,只是为了好玩,这里有一个人为的方法,使用boost.asio:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
boost::asio::streambuf readbuffer(100);
int n = 0;
void readhandler(const boost::system::error_code& error,
                size_t bytes_transferred)
{
    if(!error)
   {
      const char* buf = boost::asio::buffer_cast<const char*>(readbuffer.data());
      std::string result(buf, bytes_transferred);
      std::istringstream is(result);
      is >> n;
   }
}
int main()
{
    boost::asio::io_service ioserv;
    boost::asio::posix::stream_descriptor streamdesc(ioserv); 
    streamdesc.assign(0); // filedesc of stdin
    streamdesc.async_read_some(
                    readbuffer.prepare(readbuffer.max_size()),
                    boost::bind(readhandler, boost::asio::placeholders::error,
                                boost::asio::placeholders::bytes_transferred));
    std::cout << "You have 5 seconds to enter a number: " << std::flush;
    boost::thread server(boost::bind(&boost::asio::io_service::run, &ioserv));
    boost::this_thread::sleep(boost::posix_time::seconds(5)); // or timed_wait
    ioserv.stop();
    server.join();
    std::cout << "The number entered was " << n << 'n';
}