tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル1秒間隔のタイマースレッドの時間が14msec長くなる
記事No11811
投稿日: 2017/03/23(Thu) 14:58
投稿者還暦プログラマー
開発環境 Windows7 64Bit Visual Studio 2013 VB.NET

以下の1秒間隔のタイマースレッドを作成し、時間を表示させると、1回毎に14msec程、遅くなっていきます。  
表示時間は、以下の様になります。

2017/03/23 14:54:41.293
2017/03/23 14:54:42.304
2017/03/23 14:54:43.318
2017/03/23 14:54:44.332
2017/03/23 14:54:45.346
2017/03/23 14:54:46.360
2017/03/23 14:54:47.374
2017/03/23 14:54:48.388
2017/03/23 14:54:49.402
2017/03/23 14:54:50.416
2017/03/23 14:54:51.430
2017/03/23 14:54:52.445

' タイマ
    Private _timer As System.Threading.Timer

    Public Sub New()

        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' タイマ作成
        _timer = New System.Threading.Timer(AddressOf TimerProc)

       ' タイマ開始
        _timer.Change(0, 1000)    '1秒間隔のタイマー起動

    End Sub


    ' 1秒間隔のタイマコールバックイベント
    Private Sub TimerProc(ByVal state As Object)

        Console.WriteLine(System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff"))    'msec単位の現在時間を表示

    End Sub

まったく、解決方法が分からず、質問致します、
宜しくお願い致します。

[ツリー表示へ]
タイトルRe: 1秒間隔のタイマースレッドの時間が14msec長くなる
記事No11812
投稿日: 2017/03/23(Thu) 15:30
投稿者Hongliang
タイマに指定されるIntervalは、基本的には処理と処理の間の最低間隔を保証するだけです。
Windowsの仕組み上厳密に等間隔に実施すること自体が不可能です。たとえミリ秒精度で等間隔に実施できたとしても、サブミリ秒の余りが蓄積すればミリ秒に容易に影響しますし。

比較的誤差が少なくする手法として、タイマの間隔を十分に短い時間に設定した上で、理想時刻を超えたタイミングでメインの処理を実施する、といった方法が考えられます。
例えば1秒間隔で処理したいとすると、
・タイマ開始時に、開始時刻+1秒を理想時刻としてフィールドに保存する
・タイマのコールバックで、現在時刻と理想時刻を比較する。
 現在時刻が理想時刻を超えていればメイン処理を実行し、理想時刻を1秒増やす。
 超えていなければ今回のコールバックはすぐ返す。

[ツリー表示へ]
タイトルRe^2: 1秒間隔のタイマースレッドの時間が14msec長くなる
記事No11813
投稿日: 2017/03/23(Thu) 15:53
投稿者還暦プログラマー
> タイマに指定されるIntervalは、基本的には処理と処理の間の最低間隔を保証するだけです。
> Windowsの仕組み上厳密に等間隔に実施すること自体が不可能です。たとえミリ秒精度で等間隔に実施できたとしても、サブミリ秒の余りが蓄積すればミリ秒に容易に影響しますし。
>
> 比較的誤差が少なくする手法として、タイマの間隔を十分に短い時間に設定した上で、理想時刻を超えたタイミングでメインの処理を実施する、といった方法が考えられます。
> 例えば1秒間隔で処理したいとすると、
> ・タイマ開始時に、開始時刻+1秒を理想時刻としてフィールドに保存する
> ・タイマのコールバックで、現在時刻と理想時刻を比較する。
>  現在時刻が理想時刻を超えていればメイン処理を実行し、理想時刻を1秒増やす。
>  超えていなければ今回のコールバックはすぐ返す。


Hongliang 様

回答、誠にありがとうございます。
タイマースレッドで、遅延時間が蓄積されて行くことを解除できないとすれば、ご指摘の方法しかないかな、、、とも思い始めておりました。
貴重なご指摘、ありがとうございます。
何の迷いもなく、その方法で進めて行きたいと思います。

今後も、宜しくお願い申し上げます。

[ツリー表示へ]