【发布时间】:2015-07-27 22:45:19
【问题描述】:
我已经看到这个答案适用于其他语言,但不适用于 C++。我如何让程序等待用户按 Enter 或类似的键,而且只要没有输入键,在设定的时间段后自动继续?我需要基本代码,我是初学者。我知道 cin.get();或系统(“暂停”);将等待一个键和睡眠(x 秒);或睡眠(x 毫秒); (使用“windows.h”库)会暂停程序,但我如何同时获得两者?
【问题讨论】:
我已经看到这个答案适用于其他语言,但不适用于 C++。我如何让程序等待用户按 Enter 或类似的键,而且只要没有输入键,在设定的时间段后自动继续?我需要基本代码,我是初学者。我知道 cin.get();或系统(“暂停”);将等待一个键和睡眠(x 秒);或睡眠(x 毫秒); (使用“windows.h”库)会暂停程序,但我如何同时获得两者?
【问题讨论】:
在 Windows 中,您可以使用GetAsyncKeyState() 来轮询键盘的当前状态。然后可以使用Sleep() 休眠一定的毫秒数。将这两者结合起来,您就可以制作出您需要的东西:
int keyToWaitFor = VK_SPACE;
int count = 0;
int maxcount = 500;
for(int a = 0; a < maxcount; a++){
if (GetAsyncKeyState(keyToWaitFor)!=0){
break;
}
Sleep(5);
}
【讨论】:
由于您显然想在 Windows 上执行此操作,因此相当简单。
您首先打开控制台的句柄,例如GetStdHandle。然后,当您想要读取时,您可以在该句柄上调用WaitForSingleObject,指定您的超时值。检查退货。如果返回值为WAIT_OBJECT_0,则表示您有一些输入,您可以使用(例如)ReadConsoleInput 读取这些输入。如果返回是WAIT_TIMEOUT,则表示没有输入,所以你可以做任何你想做的事情。
【讨论】:
使用conio.h,您可以使用kbhit() 和getch() 等待按键,并使用a 等待20 秒计时器
while 循环,while( key==0 && (time_to_wait < secs) )。
#include <iostream>
#include <cstdio>
#include <ctime>
#include <conio.h>
#include <windows.h>
using namespace std;
int key=0;
bool quit=false;
void check_if_keypressed();
void gotoxy(int x, int y);
void clrscr();
int main()
{
clock_t start;
double time_to_wait;
double secs=10;
gotoxy(1, 2);
cout<<"Press any key to continue or wait 20 seconds: \n ";
start = clock();
while( key==0 && (time_to_wait < secs) )
{
check_if_keypressed();
time_to_wait = ( clock() - start ) / (double) CLOCKS_PER_SEC;
// proceed with whatever here
gotoxy(1, 23);
cout<<"countdown: "<< secs-time_to_wait <<" \n ";
}
// proceed with whatever here
// while( key!=27)
// {
// check_if_keypressed();
// do_other_stuff();
// }
return 0;
}
void check_if_keypressed()
{
if( kbhit() ) key=getch();
switch(key)
{
case 27:
quit=true;
break;
}
}
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x; coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
return;
}
void clrscr()
{
COORD coordScreen = { 0, 0 };
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD dwConSize;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsole, &csbi);
dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten);
GetConsoleScreenBufferInfo(hConsole, &csbi);
FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
SetConsoleCursorPosition(hConsole, coordScreen);
return;
}
【讨论】: