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

时间:2011-04-20 03:52:12

标签: c++

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

类似的东西:

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

这样的事情存在吗?

2 个答案:

答案 0 :(得分:4)

我很确定没有任何东西甚至可以接近便携式。就此而言,可能没有任何东西可以直接与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).

答案 1 :(得分:2)

不是真的:即使此输入是在单独的线程上执行的,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';
}