none
timeSetEventでのタイマーの挙動がおかしい RRS feed

  • 質問

  •  

    お世話になっております。XTKX です。

     

    タイマーイベントによる定周期実行を行うために、timeSetEventで

    タイマーを起動しているのですが、同じタイマーIDで同時に2回の

    CALLBACKがされてしまいます。

    そこで

      1.CALLBACK引数で渡されたタイマーIDのタイマーをtimeKillEventで停止

      2.1回目の呼出を処理している場合、2回目の処理を行わないようにする

      3.処理終了後、timeSetEventでタイマーを再起動する

    ということをしています。

     

    ここで、上記3.においてタイマーを再起動した際のタイマーIDが常に

    0 が帰ってきてしまい、タイマー起動に失敗してしまいます。

     

    何か原因等をご存知の方はいらっしゃらないでしょうか。

     

    ※プログラム上で最初のタイマー起動、および、再起動は1回しか

      行われません。

     

    以上、よろしくお願いいたします。

    2008年2月23日 0:17

回答

  •  XTKX さんからの引用

    上記に関する補足なのですが、機能のことなる複数スレッドが起動時に

    同時に起動します。

    その中の3つのスレッドがそれぞれ別々のタイマーを持ち、各々で

    独自タイマーを起動しています。

     

    1つ目のタイマーは100ミリ秒周期

    2つ目のタイマーは1秒周期

    3つ目のタイマーは5秒周期

    でCALLBACKされます。

     

    タイマーのタイプはTIME_ONESHOTです。



    TIME_ONESHOTでtimeSetEventを発行しているのであれば、タイマーIDが重複しているように見える可能性があるのではないでしょうか?
    こういう場合には、タイマーIDを信頼するのではなく、ユーザコールバックデータ(dwUser)を利用して、それを参照するのがベストだと思います。
    1つ目のタイマーが、タイムアウトしてコールバックされた時点で、ワンショットであるため、そのタイマーIDは失効しているのではないでしょうか。
    そこで、多少遅れて他のスレッドからtimeSetEventを更に発行すると、ここで先のタイマーIDが再利用される可能性があります。


    2008年2月25日 4:26

すべての返信

  •  

    お世話になっております。XTKX です。

     

    上記に関する補足なのですが、機能のことなる複数スレッドが起動時に

    同時に起動します。

    その中の3つのスレッドがそれぞれ別々のタイマーを持ち、各々で

    独自タイマーを起動しています。

     

    1つ目のタイマーは100ミリ秒周期

    2つ目のタイマーは1秒周期

    3つ目のタイマーは5秒周期

    でCALLBACKされます。

     

    タイマーのタイプはTIME_ONESHOTです。

     

    実はタイマーを起動するスレッド、および、タイマーは別々なのですが、

    起動が立て込むと動作が不安定になるということがあるのでしょうか...。

     

    以上、よろしくお願いいたします。

    2008年2月23日 1:20
  • お世話になっております。XTKXです。

     

    現象の発生環境はWindows2000 SP4です。

    再現性も不確実です。

     

    以上、よろしくお願いいします。

     

    2008年2月23日 5:19
  •  XTKX さんからの引用

    上記に関する補足なのですが、機能のことなる複数スレッドが起動時に

    同時に起動します。

    その中の3つのスレッドがそれぞれ別々のタイマーを持ち、各々で

    独自タイマーを起動しています。

     

    1つ目のタイマーは100ミリ秒周期

    2つ目のタイマーは1秒周期

    3つ目のタイマーは5秒周期

    でCALLBACKされます。

     

    タイマーのタイプはTIME_ONESHOTです。



    TIME_ONESHOTでtimeSetEventを発行しているのであれば、タイマーIDが重複しているように見える可能性があるのではないでしょうか?
    こういう場合には、タイマーIDを信頼するのではなく、ユーザコールバックデータ(dwUser)を利用して、それを参照するのがベストだと思います。
    1つ目のタイマーが、タイムアウトしてコールバックされた時点で、ワンショットであるため、そのタイマーIDは失効しているのではないでしょうか。
    そこで、多少遅れて他のスレッドからtimeSetEventを更に発行すると、ここで先のタイマーIDが再利用される可能性があります。


    2008年2月25日 4:26
  • こんにちは。中川俊輔 です。

     

    ふるかわあきひとさん、回答ありがとうございます。

     

    XTKXさん、フォーラムのご利用ありがとうございます。

    有用な情報と思われたため、

    勝手ながらふるかわあきひとさんの回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    XTKXさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

     

    2008年3月4日 5:46