2011-02-26 33 views
1

我想從一個控制檯,顯示自啓動程序以來的時間顯示時間的事件驅動的程序。C++:試圖創建事件驅動的控制檯(但堅持一個問題)

我創建了一個函數:

WORD GetKey(HANDLE input) 
{ 
    INPUT_RECORD Event; 
    DWORD Read; 

    ReadConsoleInput(input,&Event,1,&Read); 

     if(Event.EventType == KEY_EVENT) 
     { 
      if(Event.Event.KeyEvent.bKeyDown) 
      { 
       return Event.Event.KeyEvent.wVirtualKeyCode; 
      } 
     } 
    return 0; 
} 

然後我用它進主while()循環。但是,當我啓動程序時,它滯後(顯示時鐘暫停大約3-5秒延遲)。更重要的是奇怪的這個問題是,當我按住「1」鍵,滯後問題剛剛過去..:

WORD LastAction = GetKey(input) //this chunk of code lies in the main while(!quit) 
switch(LastAction) 
      { 
       case VK_ESCAPE: 
        quit = true; 
        break; 
       case '1': 
       case VK_NUMPAD1: 
        break; 
       default: 
        break; 
      } 

是不是因爲我的ReadConsoleInput()的理解是不夠的?或者我的代碼效率不高?

請告知我在這個問題上

THX

+0

您在while()循環中添加了其他內容嗎? – Raveline 2011-02-26 08:43:15

+0

是的,但這不是問題,因爲它與GetKey()函數無關。即使我試圖刪除那部分,它仍然會發生。 – user385261 2011-02-26 09:02:24

+0

你爲什麼不使用Read變量? – 2011-02-26 12:29:54

回答

2

當沒有被閱讀,ReadConsoleInput將阻止等待一個事件的事件。您需要使用GetNumberOfConsoleInputEvents檢查可用事件,然後或者在存在任何事件時閱讀事件,或者暫停一會兒,例如如果沒有,則爲Sleep(10)

+0

或者在獨立的事件輪詢線程中調用'ReadConsoleInput'? – Santa 2011-03-02 00:21:46

+1

IMO毫無意義,他的目標是處理輸入,否則會做更多或更少的事情。無需引入額外的複雜性。 – Erik 2011-03-02 00:23:59