2

キーが押された場合、または時間がなくなった場合にカウントダウン タイマー ループを終了する関数を実装したいと思います。時間遅延を使用してカウントダウンタイマーを作成しています。時間遅延の後、コンソールが更新されます。ただし、キーを押してもループから抜けません。誰でも助けることができますか?

ここに私のコードがあります:

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

}
4

2 に答える 2

6

kbhit()入力を待たず、テストを行った瞬間にキーが押された場合に戻ります。したがって、この場合、必要なときに正確にキーを押すことはなく、すぐにスリープ状態になります。

通常の使用法は次のようなものです。

while (!kbhit())

そのため、座ってキーが押されるのを待つことができます。あなたの場合、あなたは眠りたいので、キーが押されたかどうかをチェックする何らかの「カウントダウン」操作を行う必要があります...私は頭のてっぺんから素晴らしい例を持っていないので、ただ言いましょう:

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

編集: あなたの問題はコードのどこかにあると思います...古い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;
}

このプログラムは、入力を取得してスリープ メカニズムから抜け出すために機能します。

于 2012-12-19T13:25:27.390 に答える
2

より小さな時間粒度で待機するための追加のループを実行します。

int b=0;
int count;

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");

        // replacing your's
        //b=kbhit();
        //Sleep(10000);

        // with inner loop
        for(count=0; count<100&& (b=kbhit())==0; count++) {
            Sleep(100);
        }

        // this loop will wait for 10000 milliseconds but in portions of 100
        // periodically it will check keyboard
        // user will be required to keep key pressed for at least 0.1 second
        // to be caught by the loop

    }

}

forところで、追加でインナーを同封したのは何whileですか?

于 2012-12-19T13:46:40.780 に答える