00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 inline
00024 ProgressMonitor::ProgressMonitor() {
00025 Reset();
00026 }
00027
00028 inline
00029 void ProgressMonitor::Reset() {
00030
00031
00032
00033 m_job_done = true;
00034
00035 m_update_resolution = 1.0 / 100.0;
00036 m_message.erase();
00037
00038 m_progress = 0.0;
00039 m_done = false;
00040
00041 m_last_update = -2.0;
00042 }
00043
00044 inline
00045 void ProgressMonitor::StartJob(Real range_min, Real range_max, Real duration ) {
00046 assert(m_job_done);
00047 assert(!m_done);
00048
00049 assert(m_progress < 1.0);
00050 m_job_start = m_progress;
00051
00052 assert(duration > 0.0);
00053 assert(m_job_start + duration <= 1.0);
00054 m_job_duration = duration;
00055
00056 assert(range_min < range_max);
00057 m_job_range_min = range_min;
00058 m_job_range_max = range_max;
00059 m_job_progress_scale = m_job_duration / (m_job_range_max - m_job_range_min);
00060
00061 m_job_done = false;
00062
00063 post_update();
00064 }
00065
00066 inline
00067 void ProgressMonitor::EndJob() {
00068 assert(!m_job_done);
00069
00070 m_progress = m_job_start + m_job_duration;
00071 m_job_done = true;
00072
00073
00074
00075 UpdateCallback();
00076 }
00077
00078 inline
00079 void ProgressMonitor::SetUpdateResolution(Real resolution) {
00080 assert(resolution <= 1.0);
00081
00082 m_update_resolution = resolution;
00083 }
00084
00085 inline
00086 void ProgressMonitor::SetMessage(const std::string &message) {
00087 m_message = message;
00088
00089
00090
00091 UpdateCallback();
00092 }
00093
00094 inline
00095 const std::string &ProgressMonitor::GetMessage() const {
00096 return m_message;
00097 }
00098
00099 inline
00100 void ProgressMonitor::SetJobProgress(Real progress) {
00101 assert(!m_job_done);
00102 assert(!m_done);
00103 assert(progress >= m_job_range_min);
00104 assert(progress <= m_job_range_max);
00105
00106 m_progress = m_job_start +
00107 (progress - m_job_range_min) * m_job_progress_scale;
00108
00109 post_update();
00110 }
00111
00112 inline
00113 Real ProgressMonitor::GetProgress() const {
00114 return m_progress;
00115 }
00116
00117 inline
00118 void ProgressMonitor::Done() {
00119 assert(!m_done);
00120
00121 if(!m_job_done)
00122 EndJob();
00123
00124 assert(m_job_done);
00125
00126 m_progress = 1.0;
00127 m_done = true;
00128
00129
00130
00131 UpdateCallback();
00132 }
00133
00134 inline
00135 bool ProgressMonitor::IsDone() const {
00136 return m_done;
00137 }
00138
00139 inline
00140 void ProgressMonitor::post_update() {
00141 const Real elapsed = m_progress - m_last_update;
00142
00143 assert(elapsed >= 0.0);
00144
00145 if(elapsed >= m_update_resolution) {
00146 UpdateCallback();
00147
00148 m_last_update = m_progress;
00149 }
00150 }