【问题标题】:Wait for key press but auto-start after time C++等待按键但在时间 C++ 后自动启动
【发布时间】:2015-07-27 22:45:19
【问题描述】:

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

【问题讨论】:

    标签: c++ time key continue


    【解决方案1】:

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

    【讨论】:

    • 谢谢 wizebin - 我为 Sleep(1) 和 maxcount=20000 调整了它,但是如何使用 Enter?我想只需替换 int keyToWaitFor = VK_ENTER; ?
    • 您可以将密钥更改为任何虚拟密钥,找到here
    • 这是一个相当糟糕的工作方法。它会在等待未按下的键时消耗 CPU 时间,然后在按下键后在检测/处理输入之前浪费时间。
    • 我不同意——尤其是对于刚开始学习编程的人。我同意你的方法更好,但你声称消耗 CPU 时间是没有根据的。如果您想在投票中获得更高级的信息,为什么要使用控制台而不是 GUI?
    【解决方案2】:

    由于您显然想在 Windows 上执行此操作,因此相当简单。

    您首先打开控制台的句柄,例如GetStdHandle。然后,当您想要读取时,您可以在该句柄上调用WaitForSingleObject,指定您的超时值。检查退货。如果返回值为WAIT_OBJECT_0,则表示您有一些输入,您可以使用(例如)ReadConsoleInput 读取这些输入。如果返回是WAIT_TIMEOUT,则表示没有输入,所以你可以做任何你想做的事情。

    【讨论】:

      【解决方案3】:

      使用conio.h,您可以使用kbhit()getch() 等待按键,并使用a 等待20 秒计时器 while 循环,while( key==0 &amp;&amp; (time_to_wait &lt; 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-11-11
        • 2013-04-07
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多