9

Win32 サービスでタイマーを使用する最も簡単な方法を教えてください。

この目的のためにダミー ウィンドウを作成するか、2 番目のスレッドにティック カウントを実行させることができると思いますが、何が最善でしょうか? もっとエレガントな方法はありますか?

前もって感謝します。

4

6 に答える 6

15

タイマー キュー ( http://msdn.microsoft.com/en-us/library/ms686796.aspx ) を使用できます。HWND は必要ありません。

于 2008-10-22T00:31:22.407 に答える
5

UI タイマーを使用する代わりに (Mr. 1800-INFO で示されているように NULL ウィンドウ ハンドルを使用できますが)、カーネルの待機可能なタイマー オブジェクトを使用できます。API ドキュメントのCreateWaitableTimerを参照してください。これらは、WaitForSingleObject または WaitForMultipleObjects などを使用して待機できます。これは、サービスが既に外部イベントを待機している場合に特に役立ちます。

最初のリンクから明確でない場合、SetWaitableTimer 関数は完了ルーチン (ユーザー コールバック) をタイマーに関連付けることができます。スレッドが「アラート可能な」状態になるように、WaitForMultipleObjects (など) の ...Ex バージョンを使用することを忘れないでください。

于 2008-10-22T00:34:54.087 に答える
4

メイン スレッドの 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を思い出させました。

于 2008-10-22T00:30:30.180 に答える
1

SetTimer を使用してタイマーを設定し、メッセージ ループで WM_TIMER メッセージをキャッチできます。

例:

// タイマーを 10 秒で期限切れになるように設定します

SetTimer(hwnd,IDT_TIMER1, 10000,(TIMERPROC) NULL);

...メッセージループで:

スイッチ (wParam)

{ 

    case IDT_TIMER1: 

        // Boom goes the dynamite

メッセージ ループ処理を行いたくない場合は、タイプ TIMERPROC の関数を宣言し、タイマーが切れたときに呼び出されるようにすることもできます。

于 2008-10-22T00:24:53.233 に答える
1

あなたのコメントの 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を参照してください。

于 2008-10-23T12:30:55.777 に答える
0

時々「目を覚まして」仕事をしようとしているだけですか?いつでも Sleep() を使用できます。

さらに、通常、内部にスリープがある while(1 == 1) ループ内にあるスレッドがあります。そこで、シャットダウン要求やその他のハウスキーピングを確認できます。そのシステムを使用して、アプリ内のワーカー スレッドのイベントまたはミューテックスをくすぐることができます。

于 2008-10-22T00:41:51.623 に答える