掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
SetTimerを使用して一定時間後にコールバック関数を呼ぶには? (ID:71226)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ClassNameが画面を持たないと言っているので SetTimer( NULL, 0, 1000, (TIMERPROC)TimerProc ); は::SetTimer関数のはず。とすると、TimerProc関数は VOID CALLBACK TimerProc( HWND hwnd, // ウィンドウのハンドル UINT uMsg, // WM_TIMER メッセージ UINT_PTR idEvent, // タイマの識別子 DWORD dwTime // 現在のシステム時刻 ); の形になっている必要があり、クラスに属することが出来ない(グローバル関数にする必要がある)。 従ってこのままでは、或るクラスの或るインスタンス(オブジェクト)のメンバー変数である、 m_valにFALSEを代入することは不可能。 そこで、ひと工夫。 タイマー関数はSetTimer側で指定するのでクラスと特定できる。 インスタンスはタイマー番号とインスタンスのマップを作成しておくことで特定する。 具体的に書くと、 class ClassName { //以下を追加 private: // タイマー番号とインスタンスアドレスのペア struct tagTimerNumberAndInstance { INT_PTR numberOfTimer; ClassName* pInstance; }; static tagTimerNumberAndInstance m_TimerNumberAndInstance; public: static void CALLBACK TimerProc( HWND hwnd, // ウィンドウのハンドル UINT uMsg, // WM_TIMER メッセージ UINT_PTR idEvent, // タイマの識別子 DWORD dwTime // 現在のシステム時刻 ); } // ここからソースファイル側 ClassName::tagTimerNumberAndInstance ClassName::m_TimerNumberAndInstance = {0}; void ClassName::FuncA() { m_TimerNumberAndInstance.numberOfTimer = ::SetTimer(0, 0, 1000, TimerProc); if (m_TimerNumberAndInstance.numberOfTimer) { m_TimerNumberAndInstance.pInstance = this; } } VOID CALLBACK ClassName::TimerProc( HWND hwnd, // ウィンドウのハンドル UINT uMsg, // WM_TIMER メッセージ UINT_PTR idEvent, // タイマの識別子 DWORD dwTime // 現在のシステム時刻 ) { m_TimerNumberAndInstance.pInstance->m_val = FALSE; ::KillTimer(0, m_TimerNumberAndInstance.numberOfTimer); // タイマーを停止 m_TimerNumberAndInstance.numberOfTimer = 0; m_TimerNumberAndInstance.pInstance = 0; } 複数のインスタンスから同時にタイマーを使用するんだったらタイマー番号とインスタンスアドレスのペアは複数扱えるようにしておく必要がある。 イベント等を使えばもっとスマートやり方がありそうだけどSetTimerを使うとこんな感じかな。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.