4

質問:バックグラウンドでタイマーをどのようにチェックしますか?つまり、タイマースレッドを作成するスレッドは、時計が刻々と過ぎている間も他のことを行うことができます。

試行:-_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は11ではなくVisual Studio 2008を使用しているため、C++11はサポートされていません。

4

2 に答える 2

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" );
}
于 2012-11-19T16:19:38.620 に答える
0

システムタイマーの仕組みと使用方法を誤解しているのではないかと思います。要点は、タイマーがバックグラウンドで自動的に実行されるため、独自のスレッド管理を行う必要がないということです。

Timerこれには、一般的なWindowsタイマーの例と説明があり、独自のクラスをロールしようとしている場合に使用できます。タイマーチュートリアル

これはTimerWindows.NETに付属するクラスで、下部にコード例があります。タイマークラス

追加するために編集:

これは、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:タイマー関数を参照してください。

次に、ウィンドウプロシージャ内で、WM_TIMERメッセージを受け取り、必要に応じて応答します。

または、タイマーでユーザー定義のプロシージャを呼び出すこともできます。詳細については、 SetTimer関数を参照してください。

于 2012-11-19T16:08:09.063 に答える