特定の周期でデータを出力したいのですが・・

解決


L'Kbreth  2006-09-30 22:08:51  No: 96798

はじめましてお世話になります
 VB6.0を使用しています。

タイマーを使用し10秒単位でデータを計測するプログラムを作成したいのですが上手くいきません。

Private Sub Form_Load()
Dim T1 as String
Dim T2 as String

Timer1.interval = 1000
T1 = Now
T2 = Format$(T1, "yyyy/mm/dd 12:35:10")
End Sub

Private Sub Timer1_Timer()
T1 = Now
If StrComp(T1, T2, vbTextCompare) > 0 Then
    Debug.Print "A"
    '???
Else
    Debug.Print "B"
End If
End Sub

???の場所に次の計測時間を求めたいのですがどのようにしたら良いか分かる方ご指導宜しくお願いします。


あん  2006-09-30 23:23:38  No: 96799

何をしているのかわかりませんが

Timer1.interval に値をいれれば
次も Timer1_Timerを実行できます。


ヤマ@文系  2006-10-01 01:02:34  No: 96800

上手くいかなり理由がたくさんありそうなのですが。
timer1.enabled=Trueになっておりますか?
10秒毎であれば'余り正確かは不明。

Dim i as integer

Private Sub Form_Load()

i=0
Timer1.interval = 1000
timer1.enabled=True

End Sub

Private Sub Timer1_Timer()
i=i+1
If i => 10 Then
    Debug.Print "A"
    '???
i=0
Else
    Debug.Print "B"

End If
End Sub


L'kbreth  2006-10-01 03:36:02  No: 96801

返信ありがとうございます

質問の仕方が悪かったみたいですみません(__;
もし現在の時間が10時00分00秒なら次に計測するのは10時00分10秒その次は10時00分20秒といったように確実に10秒ごとに値を習得したいのです。

もしtimerのintervalを1000に設定し10回繰り返した時時間を計ってみると分かったのですが10秒や11秒と確実に10秒ざみになってるという保障がないのです。

それを防ぐために  現在の時間を習得しstrcompを使用し現在の時間と次の時間を比較し超えていれば値を表示し次の時間の値を計算したいのです。


通ってみた  2006-10-01 05:38:29  No: 96802

タイマーは正確ではないので、多少ズレが生じてもおかしくないんです

Intervalを1000にすると約1秒毎にイベントが発生しますが、それを500にして約0.5秒おきにし、前回計測した時刻の秒と、現在の時刻の秒を照らし合わせ、10秒後になっていたら表示&前回時刻の秒=現在時刻の秒に修正という作業をすれば、ほぼ秒単位でのズレはなくなると思います
もっと細かくチェックしたければIntervalを300や200にして割り込み数を増やす

最終的にはタイマー割り込みを使わずにAPIのタイマーを使用すると、もっと正確になります・・・が、10秒単位なら必要なさそうですね


L'kbreth  2006-10-01 13:28:01  No: 96803

たびたびすみません

前回時刻の秒=現在時刻の秒という計算式が知りたいのですが
T1もT2もString型で定義しているためT2 = T2 + 10とするとエラーになってしまいます。

そこでreplace関数を使用しnowで習得した中身の数字以外の文字を""で表現してみました(2006/09/30 06:12:30→20060930061230みたいな感じです)
その値に+10をするとオーバーフローしてしまいました

string型にT1 = now T2 = format(T1, "yyyy/mm/dd h:nn:ss")としているとすればT2に10秒を足したい場合どのように表現すれば良いのでしょうか?

すみませんが宜しくお願いします


魔界の仮面弁士  2006-10-01 19:34:14  No: 96804

DataAddとか。


シロ  2006-10-01 19:57:51  No: 96805

10秒単位という短い時間が連続するのであれば
あえて「タイマー」を使用せず、常に「ループ」した実装でも
よいのではないでしょうか。
(前回比較した時間と今回取得した時間を比較するやり方は
 同じだとは思いますが)

もちろん「タイマー」を使用するということが要件となっているので
あれば無理ですが。
(CPU、メモリなどのリソースに負荷を極力かけたくないなど)


L'kbreth  2006-10-01 20:45:32  No: 96806

無事解決することができました。

DateAdd関数を使用し ???のところに  T2 = DateAdd("s", 10, T2) としました。おかげで確実に10秒単位で処理ができるようになりました。

今までアドバイスをしてくださった方々本当にありがとうございました。
また分からない時があれば利用させて頂きます。
本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加