2012-12-19 30 views
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); 
    } 

} 
+0

儘量減少睡眠時間。從我在這裏看到的代碼應該按下一個鍵時退出循環。你使用什麼編譯器? –

+0

使一個進程中的等待和檢查鍵盤的內循環 – Dims

+0

我希望值每10秒更改一次。即時通訊使用C免費的Windows。 –

回答

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

該程序的作品讓我得到輸入並跳出睡眠模式hanism。

+0

它不工作,但謝謝你試圖幫助。欣賞它 –

+0

@IfanIrsyad - 對不起...你有沒有嘗試過一個類似於我的第一個音符''while(!kbhit()){print something}'的子程序,以確保它可以正常工作? – Mike

+0

@IfanIrsyad - 我以爲我會告訴你這個代碼工作的例子。你可能想檢查我的上述編輯對你的代碼,因爲這工作每10秒更新一次屏幕,並從用戶的輸入突圍。 – Mike

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 

    } 

} 

BTW,什麼你有封閉的內部for額外while