2012-11-19 82 views
4

問題:如何在後臺定時器打勾?這是創建定時器線程的線程在時鐘滴答時仍然可以做其他事情。如何讓Windows定時器在後臺線程中運行

嘗試: - 使用_beginthreadex() - >它似乎有競爭條件

class Timer{ 
... 
static unsigned __stdcall tick(void *param){ 
    while(1){ 
     Timer::timer++; 
     Sleep(Timer::timer*1000); 
    } 
    return 1; 
} 
} 

..... 
HANDLE time_thread = (HANDLE) _beginthreadex(0, 0, &Timer::tick,0,0,NULL); 
... 
//test for 20 seconds 
//want to do something while the clock is not 20 seconds 
//the mainthread here still has to receive input 
//What is the proper way to do it? 

while (Timer::getTime() != 20){ 
    cout << Timer::getTime() 
} 

CloseHandle(time_thread); 
... 

注:使用IAM的Visual Studio 2008中,不是11,我沒有C++ 11的支持。

回答

1

我不確定你在這裏有什麼問題。你已經創建了一個線程,永遠更新一個成員變量timer,你的主要用途是一個嚴格/快速的循環,可以打印(假定)那個時間,直到達到20爲止。它不是在幹什麼?技術上有增加該值與在另一個線程檢查它的競爭條件,但對於這個例子的目的,應該沒事......

編輯:嘗試一下本作無阻塞輸入全輸入控制:

HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE); 
while (true) { 
    if (WAIT_OBJECT_0 == WaitForSingleObject(hStdIn, 1000)) { 
     // read input 
     INPUT_RECORD inputRecord; 
     DWORD events; 
     if (ReadConsoleInput(hStdIn, &inputRecord, 1, &events)) { 
      if (inputRecord.EventType == KEY_EVENT) { 
       printf("got char %c %s\n", 
        inputRecord.Event.KeyEvent.uChar.AsciiChar, 
        inputRecord.Event.KeyEvent.bKeyDown ? "down" : "up"); 
      } 
     } 
    } 
    printf("update clock\n"); 
} 
+0

它會打印出像:00000001111111111112222222222222222333333333333333333 .....等等。你如何做到這一點,以便它在增加時,主線程仍然可以接收輸入?說的像。如果它不是20,你仍然可以打字 –

+0

我們在談論一個控制檯程序或一個Windows GUI程序嗎? – mark

+0

如果你只是想檢查控制檯輸入20秒,然後繼續,如果你沒有任何,你應該看'GetStdHandle(STD_INPUT_HANDLE)'和'WaitForSingleObject',並跳過線程。您可能還需要根據您嘗試執行的操作來設置「SetConsoleMode」。 – mark

0

恐怕你誤會了系統定時器是如何工作的以及如何使用它們 - 整個過程就是他們自動在後臺運行,所以你不必做自己的線程管理。

這有實例和一般的Windows計時器的解釋,你可以使用它,如果你想推出自己的Timer類:Timers Tutorial

這是帶有Windows.NET的Timer類,有在底部的代碼例如:Timer Class

編輯補充:

下面是適合於非MFC應用一個Win32的定時器實例的版本(從turorial頁):

int nTimerID; 

void Begin(HWND hWindow_who_gets_the_tick) 
{ 
    // create the timer to alert your window: 
    nTimerID = SetTimer(hWindow_who_gets_the_tick, uElapse, NULL); 
} 

void Stop() 
{ 
    // destroy the timer 
    KillTimer(nTimerID); 
} 

有關詳細信息,請參見MSDN: Timer functions

然後在你的窗口程序中,你得到WM_TIMER消息,並按你的喜好做出響應。

或者,定時器可以調用用戶定義的過程。詳細信息請參見SetTimer function

+0

我來看看。謝謝。是否有任何解決方案,沒有MFC –