是否有可能在指定的时间后绕过std::cin
Is it possible to bypassing std::cin after a specified amount of time?
我正在寻找一种在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';
}
相关文章:
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- Problems with std::cin.fail()
- istream std::cin如何修改自定义istream缓冲区
- 在 std::getline 和 std::cin 期间卡在循环中
- C++ 限制或使用户输入不可见 (std::cin)
- 吃完 EOF 后重复使用 std::cin
- 当使用 std::CIN 输入结构时,它会出错
- 如何使 std::istream 从键盘获取输入(如 std::cin)?
- 如何将 std::cin 作为函数的参数传递?
- std::cin不接受输入
- 在C++中使用 std::cin 将字符传递给 int
- 为什么 std::cin 从一开始就不读
- 从 R 控制台获取用户输入:Rcpp 和 std::cin
- 定义宏时与 std::cin C++中的分段错误
- 如何终止 std::cin.get() 的 ''
- 将 istream 转换为 ifstream 时将 std::cin 传递到参数时出现问题
- STD :: cin和Scanf()应用于字符串之间的区别
- 在GLFW应用程序中,std::cin的行为很奇怪
- 如何使用std::cin函数后修复从文件读取的问题
- std::string 是否仅适用于 c++ 中的'std::cin'