トップ回答者
timeSetEventでのタイマーの挙動がおかしい

質問
-
お世話になっております。XTKX です。
タイマーイベントによる定周期実行を行うために、timeSetEventで
タイマーを起動しているのですが、同じタイマーIDで同時に2回の
CALLBACKがされてしまいます。
そこで
1.CALLBACK引数で渡されたタイマーIDのタイマーをtimeKillEventで停止
2.1回目の呼出を処理している場合、2回目の処理を行わないようにする
3.処理終了後、timeSetEventでタイマーを再起動する
ということをしています。
ここで、上記3.においてタイマーを再起動した際のタイマーIDが常に
0 が帰ってきてしまい、タイマー起動に失敗してしまいます。
何か原因等をご存知の方はいらっしゃらないでしょうか。
※プログラム上で最初のタイマー起動、および、再起動は1回しか
行われません。
以上、よろしくお願いいたします。
回答
-
XTKX さんからの引用 上記に関する補足なのですが、機能のことなる複数スレッドが起動時に
同時に起動します。
その中の3つのスレッドがそれぞれ別々のタイマーを持ち、各々で
独自タイマーを起動しています。
1つ目のタイマーは100ミリ秒周期
2つ目のタイマーは1秒周期
3つ目のタイマーは5秒周期
でCALLBACKされます。
タイマーのタイプはTIME_ONESHOTです。
TIME_ONESHOTでtimeSetEventを発行しているのであれば、タイマーIDが重複しているように見える可能性があるのではないでしょうか?
こういう場合には、タイマーIDを信頼するのではなく、ユーザコールバックデータ(dwUser)を利用して、それを参照するのがベストだと思います。
1つ目のタイマーが、タイムアウトしてコールバックされた時点で、ワンショットであるため、そのタイマーIDは失効しているのではないでしょうか。
そこで、多少遅れて他のスレッドからtimeSetEventを更に発行すると、ここで先のタイマーIDが再利用される可能性があります。
すべての返信
-
お世話になっております。XTKX です。
上記に関する補足なのですが、機能のことなる複数スレッドが起動時に
同時に起動します。
その中の3つのスレッドがそれぞれ別々のタイマーを持ち、各々で
独自タイマーを起動しています。
1つ目のタイマーは100ミリ秒周期
2つ目のタイマーは1秒周期
3つ目のタイマーは5秒周期
でCALLBACKされます。
タイマーのタイプはTIME_ONESHOTです。
実はタイマーを起動するスレッド、および、タイマーは別々なのですが、
起動が立て込むと動作が不安定になるということがあるのでしょうか...。
以上、よろしくお願いいたします。
-
XTKX さんからの引用 上記に関する補足なのですが、機能のことなる複数スレッドが起動時に
同時に起動します。
その中の3つのスレッドがそれぞれ別々のタイマーを持ち、各々で
独自タイマーを起動しています。
1つ目のタイマーは100ミリ秒周期
2つ目のタイマーは1秒周期
3つ目のタイマーは5秒周期
でCALLBACKされます。
タイマーのタイプはTIME_ONESHOTです。
TIME_ONESHOTでtimeSetEventを発行しているのであれば、タイマーIDが重複しているように見える可能性があるのではないでしょうか?
こういう場合には、タイマーIDを信頼するのではなく、ユーザコールバックデータ(dwUser)を利用して、それを参照するのがベストだと思います。
1つ目のタイマーが、タイムアウトしてコールバックされた時点で、ワンショットであるため、そのタイマーIDは失効しているのではないでしょうか。
そこで、多少遅れて他のスレッドからtimeSetEventを更に発行すると、ここで先のタイマーIDが再利用される可能性があります。