按下一个键后立即退出包含时间延迟的循环

Ifa*_*yad 2 c loops timedelay

我想实现一个函数,如果按下某个键或者时间用完,它将退出倒数计时器循环.我正在使用延时来制作倒数计时器,并且在延时之后,控制台将刷新.但是,当我按下一个键时,它不会退出循环.有人可以帮忙吗?

这是我的代码:

int b=0;

while(minutes_left>0)
{
    for(minutes_left=minutes_left;minutes_left>0 && b==0;minutes_left-=10)
    {
        system("cls");
        banner();
        printf("    TIME LEFT\n");
        printf("----------------\n");
        printf("     %d:%d0\n",(minutes_left/60), (minutes_left%60)/10);
        printf("----------------\n");
        printf("\nPress any key to enter you transaction code and finish parking\n");
        b=kbhit();
        Sleep(10000);
    }

}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ike 6

kbhit()不等待任何输入,只要在您进行测试的瞬间按下一个键,它就会返回.所以在这种情况下,你根本不需要在你需要的时候完全按下键,然后你就会立即进入睡眠状态.

正常使用类似于:

while (!kbhit())
Run Code Online (Sandbox Code Playgroud)

所以你可以坐下来等待按键.在你的情况下,因为你想要睡觉,你应该做一些"倒计时"操作检查按键...我没有一个很好的例子,所以我只是说:

int countdown;
for(minutes_left=minutes_left;minutes_left>0 && b==0;minutes_left-=10)
{
    countdown = 0;
    system("cls");
    ...
    while(countdown++ <= 1000){  // give a second to hit something
        if(b=kbhit())            // if the user presses a key
            break;               // leave the loop early
        Sleep(1);                // else, sleep for 1 ms and try again
    }
    if (b == 0)          // if nothing was pressed
        Sleep(9000);     // sleep for another 9s
Run Code Online (Sandbox Code Playgroud)

编辑: 我认为你的问题可能是在代码中的其他地方...我把旧的Windows电脑掸掉并尝试了一下:

int main()
{
    int i, b = 0, countdown;
    for(i = 0; i<10000 && b ==0; i++)
    {
         countdown = 0;
         system("cls");
         printf("menu stuff %d\n", i);
         while(countdown++ <= 1000) {
           if(b = kbhit())
              break;
           Sleep(1);
         }
         if(b == 0)
           Sleep(9000);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个程序适用于我获取输入和打破睡眠机制.