我正在寻找一种在X秒后跳过用户输入的方法。
类似的东西:
std::cout << "Enter a number \n";
timer(5000)
{
std::cin >> number;
}
//the rest of the program.
这样的事情存在吗?
答案 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';
}