■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#39907-0Timerを確実に動かすKEI2001-03-07(水) 00:23
     #39908-0RE#39907:Timerを確実に動かすおぎ2001-03-07(水) 00:45
     #39910-0RE#39908:Timerを確実に動かすKEI2001-03-07(水) 02:37
     #39924-0RE#39910:Timerを確実に動かすろってんまいあ2001-03-07(水) 09:47
     #39941-0RE#39924:Timerを確実に動かすKEI2001-03-07(水) 12:19
     #39942-0RE#39907:Timerを確実に動かすtani2001-03-07(水) 12:42
     #39943-0RE#39941:Timerを確実に動かすろってんまいあ2001-03-07(水) 12:43
#39907-0
Timerを確実に動かす
初めまして。初心者の悩みにお答えいただけたら、幸いです。

Timerを確実に決めたIntervalで動かすにはどうすれば良いのでしょう?
Intervalを短くすればするほど、ズレが大きくなる感じです(体感的に)。
Intervalを出来れば100、長くても2000で確実に動かしたいと思っています。

どなたか御わかりになるかがいらっしゃいましたら、お答えいただけないでしょうか?
#39908-0
RE#39907:Timerを確実に動かす
うーん。タイマーを使って一定時間ごとにシステム時間(?パソコンの時間)
を取得すればいいんじゃないかと思いますが・・・。
違ってたらごめんなさい。(^^;
#39910-0
RE#39908:Timerを確実に動かす
>一定時間ごとにシステム時間を取得すればいいんじゃないかと・・・

おぎさん、早速のレスありがとうございます。

確かに、それも考えたのですが・・・。
やりたいことはSliderを1秒なり、0.1秒なりの単位で確実に動かすことです。
システム時間と、このことを連結させる方法が思いつきませんで。
「システム時間(パソコンの時計)が1秒進んだら・・・」ということは可能でしょうか?

せっかくのお答えに、さらに質問を返して申し訳ありません。
#39924-0
RE#39910:Timerを確実に動かす
> >一定時間ごとにシステム時間を取得すればいいんじゃないかと・・・
> 
> おぎさん、早速のレスありがとうございます。
> 
> 確かに、それも考えたのですが・・・。
> やりたいことはSliderを1秒なり、0.1秒なりの単位で確実に動かすことです。
> システム時間と、このことを連結させる方法が思いつきませんで。
> 「システム時間(パソコンの時計)が1秒進んだら・・・」ということは可能でしょうか?
> 
> せっかくのお答えに、さらに質問を返して申し訳ありません。

タイマーイベントは、前回のタイマーイベントの終了から Interval プロパティ値の経過後に
次のイベントが発生します。

つまり、Interval = 1500 のタイマーコントロールの、Timer イベントに 700ms の処理を
記述すると、約2200ms おきにイベントが発生します。
もし処理時間が、500〜1000ms で不規則であるならば、2000〜2500msおきに発生します。

ですので、正確な時間間隔で処理したいのならば、Interval プロパティ値を小さくし、前回の
処理時間からの経過時間を過ぎていたら処理を実行するという手法が必要です。
#39941-0
RE#39924:Timerを確実に動かす
> 正確な時間間隔で処理したいのならば、Interval プロパティ値を小さくし、前回の
> 処理時間からの経過時間を過ぎていたら処理を実行するという手法が必要です。

ろってんまいあさん、レス有り難うございます。

なるほど、Timerがずれてくる理由がよく分かりました。
しかし、上記の手法はどのように行えば良いのでしょう?
ヒントだけでも、御教授願えないでしょうか?

初心者ゆえ、度重なる質問をご容赦ください。
#39942-0
RE#39907:Timerを確実に動かす
tani です。

> Timerを確実に決めたIntervalで動かすにはどうすれば良いのでしょう?

「Timerを確実に動かす」というのとは違ってしまいますが、
逆に、処理から処理までの時間を、指定の時間まで止めてしまってはどうでしょう。

timeGetTime API 関数(Windows 起動からの経過時間を取得)を使用して以下のようにすると、
「処理」とかかれた処理が終了すると、指定の時間間隔まで待っていて、
次のループに移るというようになっています。

Dim NextTime As Long
Dim lnCnt As Long
For lnCnt = 1 To 10
    NextTime = timeGetTime() + 100 ' 1ループ100ミリ秒
    
    ' 処理
    ・・・

    ' NextTime の時間になるまで待機
    Do
        DoEvents
    Loop While timeGetTime < NextTime
Next lnCnt
#39943-0
RE#39941:Timerを確実に動かす
> なるほど、Timerがずれてくる理由がよく分かりました。
> しかし、上記の手法はどのように行えば良いのでしょう?
> ヒントだけでも、御教授願えないでしょうか?
> 
> 初心者ゆえ、度重なる質問をご容赦ください。


あくまでも一例です。

Private Sub Form_Load()
    ' インターバル値設定
    '  例えば、Interval=300 なら理論最大300ms の誤差となる
    '  小さくしすぎると誤差は小さくなるが、遅いマシンでの負荷が上がる
    Timer1.Interval = 300
End Sub

Private Sub Timer1_Timer()
    Static LastTime As Date
    Dim NowTime As Date

    NowTime = Now
    If Second(NowTime) = 0 Or DateDiff("s", LastTime, NowTime) > 60 Then
        ' 秒がゼロ又は、前回の実行時から60秒以上経過していたら実行
        Call SubProc
        LastTime = NowTime
    End If
End Sub
このページと関連する記事:
#18018-0次回からは表示させない・・2001-09-27(木) 16:48
#33233-0タイマー機能2000-11-10(金) 00:33
#17890-0Timerを使ったTime表示2001-09-19(水) 15:50
#13181-0時計が遅れてくる。2000-12-05(火) 09:14
#27573-0タイマー処理2000-08-08(火) 13:54
#32045-0時間制御について2000-10-19(木) 18:22
#441-1タイマーコントロール以外の時間の取得方法2002-08-23(金) 23:34
#13392-0ストップウオッチ2000-12-13(水) 01:39
#599-2Timer関数について2003-12-25(木) 14:02
#25054-0timerで1分以上・・・2001-12-03(月) 17:03
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)