タイマイベントを使用しないで一定間隔で処理を行いたいのですがいい方法知りませんか?
Sleep API使ってループ回すとか,
スレッド使うとか,目的次第では方法はあるでしょうが,
一般にタイマー使わずにインターバル処理を行うのはそれなりの知識を要求しますし,非常に面倒くさいです。
タイマを使いたくない理由は何でしょうか?
CPUパワーを浪費してもいいなら、
Loop内でtimeGetTimeをチェックするのが正確でしょう。
単に「Timerコントロールを使いたくない」というのなら、
SetTimerやSetTimeEventを使うとか、
サブクラス化してWM_TIMERメッセージを拾う、という手もありますが、
それだけの苦労をする価値があるかどうかは疑問です。
皆さんどやどや言っていますが、それほど難しくはありません。
実際の動作はVBの関数とそれほどかわらないので、試してみると良いかもしれません。
その際には、終了時にちゃんとKillTimerで開放してやらないとウィンドウズの動作が不安定になります。
タイマーイベントを利用する方法は、VBの標準タイマーコントロールの動作と同じ(というよりまったくそれ)なので、TimerProcを使う方法が良いと思います。
TimerProcはイベントより正確です。
スレッドが更新されていたので見直して気づきました。
SetTimeEventではなくtimeSetEventですね。失礼。
> TimerProcはイベントより正確です。
なぜ?
TimerProcが呼び出されるのは,WM_TIMERをDispatchMessageした時です。
つまり,タイミングはイベントとまったくかわりありません。
> TimerProcはイベントより正確です。
> つまり,タイミングはイベントとまったくかわりありません。
VBのタイマーコントロールはイベントプロシージャーを抜けてから
指定のインターバルをカウントします。
対して、SetTimerを使用すればコールバック関数内の処理時間も
含めた上で、指定インターバルでコールされます。
イトウさんが言いたかったのはイベント云々ではなく
タイマーコントロールと比較しての話ではないでしょうか。
まぁ、それが仕様だと言われれば、確かにそうなんでしょうが。
追記:何か自分の投稿を見直してみると引用がへたくそだな・・・。
> TimerProcが呼び出されるのは,WM_TIMERをDispatchMessageした時です。
がないと文章の意味が不明ですね・・・。
申し訳ないです。
まったく、稚拙で申し訳ありません。
私も、ウィンドウプロシージャにイベントを送って、それをVBの内部機構が判断して、
Timerイベントを発生する時間のずれと、そして内部イベントを処理するDoeventsメソッドの時間的なロスをちゃんと描き入れるべきでした。
ツイート | ![]() |