等待按键,但在时间C ++后自动启动

时间:2015-05-15 21:39:45

标签: c++ time key continue

我已经看到这个解决了其他语言但不适用于C ++。我如何让程序等待用户按Enter或类似的键,但是如果没有输入密钥,还会在设定的时间段后自动继续?我需要基本的代码,我是一个初学者。我知道cin.get();或系统(“暂停”);等待钥匙并睡觉(x秒);或睡眠(x毫秒); (使用“windows.h”库)会暂停一个程序,但是如何同时获取这两个程序?

3 个答案:

答案 0 :(得分:0)

在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);
    }

答案 1 :(得分:0)

由于您显然希望在Windows上执行此操作,因此非常简单。

首先打开控制台的句柄,例如使用GetStdHandle。然后,当您想要读取时,在该句柄上调用WaitForSingleObject,指定超时值。检查退货。如果返回值为WAIT_OBJECT_0,则表示您有一些输入,您可以阅读(例如)ReadConsoleInput。如果返回值为WAIT_TIMEOUT,则表示没有输入,因此您可以执行其他任何操作。

答案 2 :(得分:0)

使用conio.h,您可以等待kbhit()getch()的按键,并等待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;
}