Timerコントロールを使わずに、OSの時間で動作する(タスクスケジューラのような感じで、何時何分になったらメッセージボックスを表示するといったような)プログラムを作成したいのですが、何かヒント等ご存知の方いらっしゃいましたら、教えてください。
Onキーワードの時間関係で確かあったと思います。
指定の時間になると割り込みをします。
Loadイベントとかで、無限ループを作って、そこで実行するのもいいですね、
Do
i=GetTickTime'システムでの起動からのミリ秒を得る
DoEvents
if i mod 1000 =0 then'1秒ごと(起動してからのミリ秒が1000で割り切れる数だったら)に実行
’ここにステートメントをいれる
End if
Loop
"理論上は"動くはずです^^;
GetTickTimeはGetTickCountでしょうか。
GetTickCountは精度が低いので
よほどCPUパワーがないと、if i mod 1000 =0 thenでは
一度も動作しないでしょう。
(DoEventsを毎回、1ミリ秒以下で処理しなければならないため)
timeGetTimeを使用しても厳しいと思います。
上記の例で行くと
i = GetTickCount + 1000
Do
DoEvents
If GetTickCount() > i Then
'1秒ごとの処理
i = GetTickCount + 1000 ' 更新
End If
Loop
の方が、確実に処理を行うことができるでしょう。
でも、DoEventsではCPUをガシガシ使ってしまうので
質問のように、数分、数十分に一回行うような処理には
あまり向かないような気がします。
αさん、たかみちえさん、こころさん、回答ありがとうございます。
今回私が考案してるプログラムはサーバで常時起動させておくものなので、こころさんからコメント頂いていたように、GetTickTimeを使用したプログラムは今回は向いてないみたいです。(すみません、説明不足でした)
αさんが書かれていた、時間指定で割り込み動作を行う方法は、どういったものなのか、詳しくご存知でしたら、教えていただきたいです。度々申し訳ないのですがよろしくお願いします。
APIならSetTimerかtimeSetEventでしょう。
ただし、コールバック関数の知識が必要です。
ごめんなさい。On系で時間を扱うのは別のBasicでした。
混乱させてしまってすみません。
結局タイマーコントロールを使うので、本題とはちょっとちがいますけど…。
Timerのインターバルを、目的の10分の1くらいにして、
GetTick関係のAPIとくみ合わせれば、
まあ、ふつう人にはばれないくらいの精度のタイマーが出来ます^^;
まあ、さすがにパソコンが異常に遅いときにはばれますが…。
そのときは、他のどうさにあわせて遅れてくれるので、
かえって正確なのよりいいんじゃないでしょうか?
サブクラスとか使ったりすると、エラーが起こるたびにVBが落ちるのでシステムタイマーはつかいません。
(でも、システムタイマーって強制終了するような処理したっけ…)
というより、単にメンドウなので^^;
皆様、回答ありがとうございました!
ひとまず、Sayさんに教えていただいた、settimer、timeSetEventのAPIでの実現を考えてみます。
他にももしあれば、回答いただけるとありがたいです。
SetTimerは設定は楽ですがシステムに戻らない処理が続くと遅延します。そういう意味で、より正確なtimeSetEventのほうをお勧めします。Game系のPageなんかによく使用例がのってます。
ツイート | ![]() |