2 using System.Diagnostics;
7 /// ある int 型整数を、開始値から終了値まで、一定間隔で単純増加させるカウンタ。
8 /// 終了値に達したら開始値に戻る。以降、それを繰り返す。
10 public class 単純増加後反復カウンタ
13 /// カウンタを進行し、現在の値を取得する。
28 /// カウンタを進行し、現在の値を割合(0.0:開始値 ~ 1.0:終了値)に変換して取得する。
36 Debug.Assert( 0 != ( this._終了値 - this._開始値 ) );
38 return (float) ( this._現在値 - this._開始値 ) / (float) ( this._終了値 - this._開始値 );
66 /// カウンタを進行し、その結果、カウンタの進行がまだ動作中なら true を返す。
67 /// (終了値に達しているかどうかは別問題。)
75 this._進行する(); // 終了してるかどうか判定する前に、溜まってる進行を全部消化する。
82 /// カウンタの進行が一時停止されているなら true を返す。
83 /// (終了値に達しているかどうかは別問題。)
85 public bool 停止中である => !this.動作中である;
88 /// 初期化のみ行い、カウンタは開始しない。
92 this._間隔ms = QPCTimer.未使用;
102 /// 初期化し、同時にカウンタを開始する。
104 public 単純増加後反復カウンタ( int 最初の値, int 最後の値, long 値をひとつ増加させるのにかける時間ms = 1000 ) : this()
106 this.開始する( 最初の値, 最後の値, 値をひとつ増加させるのにかける時間ms );
109 public void 開始する( int 最初の値, int 最後の値, long 値をひとつ増加させるのにかける時間ms = 1000 )
111 lock( this._スレッド間同期 )
113 this._間隔ms = 値をひとつ増加させるのにかける時間ms;
114 this._定間隔進行 = new 定間隔進行(); // 同時に開始する。
116 this._終了値 = System.Math.Max( 最初の値, 最後の値 ); // 逆転しないことを保証。
124 lock( this._スレッド間同期 )
126 this._定間隔進行.経過時間の計測を一時停止する();
133 lock( this._スレッド間同期 )
135 this._定間隔進行.経過時間の計測を再開する();
140 private int _開始値 = 0;
142 private int _終了値 = 0;
144 private int _現在値 = 0;
146 private bool _動作中 = false;
148 private long _間隔ms = QPCTimer.未使用;
150 private 定間隔進行 _定間隔進行 = null;
152 private readonly object _スレッド間同期 = new object();
155 /// 前回のこのメソッドの呼び出しからの経過時間をもとに、必要なだけ現在値を増加させる。
156 /// カウント値が終了値に達している場合は、開始値に繰り戻す。
160 if( this._間隔ms == QPCTimer.未使用 )
161 return; // 開始されていないなら無視。
163 lock( this._スレッド間同期 )
165 this._定間隔進行?.経過時間の分だけ進行する( this._間隔ms, () => {
172 if( this._現在値 > this._終了値 )
173 this._現在値 = this._開始値;