我正在尋找一種在X秒後跳過用戶輸入的方法。是否可以在指定的時間後繞過std :: cin?
喜歡的東西:
std::cout << "Enter a number \n";
timer(5000)
{
std::cin >> number;
}
//the rest of the program.
像這樣的東西存在嗎?
我正在尋找一種在X秒後跳過用戶輸入的方法。是否可以在指定的時間後繞過std :: cin?
喜歡的東西:
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).
是否有我需要包含的預處理器指令?我收到有關範圍的錯誤。 – 2011-04-20 04:53:37
你需要'#include
非常感謝!有沒有一個網站能夠解釋這件事的確切含義,所以我比深深地瞭解它更深刻。 – 2011-04-20 04:58:58
不是真的:即使此輸入在單獨的線程上執行,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';
}
您希望使用哪些系統? – 2011-04-20 04:37:50
@jerry Windows XP/7 – 2011-04-20 04:41:02