TNB Library
TnbProgressTime.h
[詳解]
1#pragma once
11#include "TnbTickCount.h"
12
13
14
15//TNB Library
16namespace TNB
17{
18
19
20
49{
50public:
51
56 CProgressTime(DWORD ri = 5) : m_recheckInverval(ri * 1000)
57 , m_total(0), m_pos(0), m_lastPos(0), m_parSec(0.0), m_lastParSec(0.0), m_previousResult(-1)
58 {
59 }
60
65 void Start(LONGLONG total = 100)
66 {
67 m_total = total;
68 m_pos = 0;
69 m_lastPos = 0;
70 m_parSec = 0.0;
71 m_lastParSec = 0.0;
72 m_tick.Reset();
73 m_lastTick.Reset();
74 m_previousResult = -1;
75 m_previousTick.Reset();
76 }
77
82 void Resume(void)
83 {
84 m_parSec = 0.0;
85 m_lastParSec = 0.0;
86 m_lastTick.Reset();
87 m_previousResult = -1;
88 m_previousTick.Reset();
89 }
90
96 void SetPos(LONGLONG pos)
97 {
98 m_pos = pos;
99 }
100
107 void Set(LONGLONG pos, LONGLONG total)
108 {
109 m_pos = pos;
110 m_total = total;
111 }
112
118 void operator+=(LONGLONG d)
119 {
120 m_pos += d;
121 }
122
127 void operator++(void)
128 {
129 operator+=(1);
130 }
131
136 void operator++(int)
137 {
138 operator+=(1);
139 }
140
145 LONGLONG GetPos(void) const
146 {
147 return m_pos;
148 }
149
154 LONGLONG GetTotal(void) const
155 {
156 return m_total;
157 }
158
163 double GetRate(void) const
164 {
165 if ( m_total <= 0 )
166 {
167 return 0.0;
168 }
169 double p = double(m_pos) / double(m_total);
170 if ( p > 1.0 )
171 {
172 p = 1.0;
173 }
174 return p;
175 }
176
184 {
185 int pr = m_previousResult;
186 int r = m_Calc();
187 m_previousResult = r;
188 if ( r <= 0 )
189 {
190 return r;
191 }
192 if ( pr < 0 || m_previousTick.IsPassedAndReset(1000) )
193 {
194 // 以前のが無い or 1秒以上経過している。
195 return r;
196 }
197 int rr = (r + pr) / 2;
198 return rr;
199 }
200
208 int _deprecated EstimateRemainingTime(void)
209 {
210 return EstimateRemainingSecond() * 1000;
211 }
212
213private:
214 // 残り時間計算
215 int m_Calc(void)
216 {
217 if ( m_pos >= m_total )
218 {
219 return 0;
220 }
221 if ( m_pos == 0 )
222 {
223 return 0;
224 }
225 DWORD lp = m_lastTick.GetPassedCount();
226 if ( lp >= m_recheckInverval )
227 {
228 //X秒超えた
229 m_lastTick.Reset();
230 double d = static_cast<double>(m_pos - m_lastPos); //このX秒で変化した数
231 d *= 1000.0;
232 d /= lp; //一秒間で増える数
233 m_lastParSec = m_parSec;
234 m_parSec = d;
235 m_lastPos = m_pos;
236 }
237 if ( m_parSec > 0.0 )
238 {
239 double r = static_cast<double>(m_total - m_pos); //残りの数
240 if ( m_lastParSec > 0.0 )
241 {
242 r /= (m_parSec + m_lastParSec) / 2.0;
243 }
244 else
245 {
246 r /= m_parSec;
247 }
248 return int(r) + 1;
249 }
250 //
251 DWORD passed = m_tick.GetPassedCount();
252 UINT r = static_cast<UINT>(passed * m_total / m_pos - passed);
253 if ( r < m_recheckInverval )
254 {
255 return r / 1000 + 1;
256 }
257 return -1;
258 }
259
260 CTickCount m_tick;
261 LONGLONG m_total;
262 LONGLONG m_pos;
263 //
264 CTickCount m_lastTick;
265 LONGLONG m_lastPos;
266 double m_parSec;
267 double m_lastParSec;
268 DWORD m_recheckInverval;
269 //
270 CTickCount m_previousTick;
271 int m_previousResult;
272};
273
274
275
276};//TNB
277
278//
279// 10%終わった時、5秒かかった
280// 残りは90%。さて、後何秒かかる?
281// 答え、45秒。
282// 10% : 5秒 100% : 50秒
283//
284// 50%終わった時、30秒かかった
285// 残りは50%。さて、後何秒かかる?
286// 答え、30秒。
287// 50% : 30秒 100% : 60秒
288//
289// Step2;
290// 最近の10%を終わるのに5秒かかった5*100
291
経過時間管理関係のヘッダ
進捗時間管理クラス
void operator++(void)
[設定] 進捗
void operator++(int)
[設定] 進捗
LONGLONG GetPos(void) const
[取得] 進捗値取得
void operator+=(LONGLONG d)
[設定] 進捗
void Start(LONGLONG total=100)
[開始] 開始.
double GetRate(void) const
[取得] 経過割合取得
CProgressTime(DWORD ri=5)
コンストラクタ.
void Resume(void)
[設定] レジューム.
void SetPos(LONGLONG pos)
[設定] 進捗
void Set(LONGLONG pos, LONGLONG total)
[設定] 進捗、全体値設定
LONGLONG GetTotal(void) const
[取得] 全体値取得
int EstimateRemainingSecond(void)
[計算] 残り時間計算
int _deprecated EstimateRemainingTime(void)
[計算] 残り時間計算
経過時間管理クラス
Definition: TnbTickCount.h:57
bool IsPassedAndReset(DWORD dwTime, bool isNow=true)
[確認] 経過確認&リセット.
Definition: TnbTickCount.h:128
DWORD GetPassedCount(void) const
[取得] 経過時間取得.
Definition: TnbTickCount.h:102
void Reset(void)
[設定] リセット.
Definition: TnbTickCount.h:82
TNB Library
Definition: TnbDoxyTitle.txt:2