Win32 サービスでタイマーを使用する最も簡単な方法を教えてください。
この目的のためにダミー ウィンドウを作成するか、2 番目のスレッドにティック カウントを実行させることができると思いますが、何が最善でしょうか? もっとエレガントな方法はありますか?
前もって感謝します。
Win32 サービスでタイマーを使用する最も簡単な方法を教えてください。
この目的のためにダミー ウィンドウを作成するか、2 番目のスレッドにティック カウントを実行させることができると思いますが、何が最善でしょうか? もっとエレガントな方法はありますか?
前もって感謝します。
タイマー キュー ( http://msdn.microsoft.com/en-us/library/ms686796.aspx ) を使用できます。HWND は必要ありません。
UI タイマーを使用する代わりに (Mr. 1800-INFO で示されているように NULL ウィンドウ ハンドルを使用できますが)、カーネルの待機可能なタイマー オブジェクトを使用できます。API ドキュメントのCreateWaitableTimerを参照してください。これらは、WaitForSingleObject または WaitForMultipleObjects などを使用して待機できます。これは、サービスが既に外部イベントを待機している場合に特に役立ちます。
最初のリンクから明確でない場合、SetWaitableTimer 関数は完了ルーチン (ユーザー コールバック) をタイマーに関連付けることができます。スレッドが「アラート可能な」状態になるように、WaitForMultipleObjects (など) の ...Ex バージョンを使用することを忘れないでください。
メイン スレッドの WM_TIMER メッセージを送信できます。メッセージの lParam は、コールバック関数のアドレスです。または、NULL のままにして、メッセージ ポンプで自分で処理することもできます。
この例では、タイマーをスレッド メッセージ ポンプに送信しています。タイマーにウィンドウを関連付ける必要はありません。
UINT timer;
VOID CALLBACK Timer(HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime
)
{
KillTimer(0, timer);
}
timer=SetTimer(0, // window handle
0, // id of the timer message, leave 0 in this case
10000, // millis
Timer // callback
);
// pump messages
while (GetMessage) etc...
Timer コールバックは、DispatchMessage によって呼び出されます。この質問は、最近のONTを思い出させました。
SetTimer を使用してタイマーを設定し、メッセージ ループで WM_TIMER メッセージをキャッチできます。
例:
// タイマーを 10 秒で期限切れになるように設定します
SetTimer(hwnd,IDT_TIMER1, 10000,(TIMERPROC) NULL);
...メッセージループで:
スイッチ (wParam)
{
case IDT_TIMER1:
// Boom goes the dynamite
メッセージ ループ処理を行いたくない場合は、タイプ TIMERPROC の関数を宣言し、タイマーが切れたときに呼び出されるようにすることもできます。
あなたのコメントの 1 つで、「...サービスは他のスレッドで処理を行っています。毎秒いくつかのファイルのステータスを確認する必要があるだけです。」
ポーリングは、ファイルの状態をチェックする最適な方法ではなく、システムのパフォーマンスに悪影響を及ぼします。ネットワーク経由でこれを実行すると (場合によっては) 問題が発生しますが、 http://msdn.microsoft.com/en-us/library/aa364417(VS.85).aspxまたはhttp://msdn.microsoft.comを確認してください。その方法については/en-us/library/aa365261(VS.85).aspxを参照してください。なぜそうすべきかについてはhttp://blogs.msdn.com/oldnewthing/archive/2006/01/24/516808.aspxを参照してください。
時々「目を覚まして」仕事をしようとしているだけですか?いつでも Sleep() を使用できます。
さらに、通常、内部にスリープがある while(1 == 1) ループ内にあるスレッドがあります。そこで、シャットダウン要求やその他のハウスキーピングを確認できます。そのシステムを使用して、アプリ内のワーカー スレッドのイベントまたはミューテックスをくすぐることができます。