00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkProgressReporter_h
00018 #define __itkProgressReporter_h
00019
00020 #include "itkProcessObject.h"
00021
00022 namespace itk
00023 {
00024
00058 class ITKCommon_EXPORT ProgressReporter
00059 {
00060 public:
00062 ProgressReporter(ProcessObject* filter, int threadId,
00063 unsigned long numberOfPixels,
00064 unsigned long numberOfUpdates = 100,
00065 float initialProgress = 0.0f,
00066 float progressWeight = 1.0f );
00067
00069 ~ProgressReporter();
00070
00072 void CompletedPixel()
00073 {
00074
00075 if(--m_PixelsBeforeUpdate == 0)
00076 {
00077 m_PixelsBeforeUpdate = m_PixelsPerUpdate;
00078 m_CurrentPixel += m_PixelsPerUpdate;
00079
00080 if (m_ThreadId == 0)
00081 {
00082 m_Filter->UpdateProgress(
00083 m_CurrentPixel * m_InverseNumberOfPixels * m_ProgressWeight + m_InitialProgress);
00084 }
00085
00086 if( m_Filter->GetAbortGenerateData() )
00087 {
00088 std::string msg;
00089 ProcessAborted e(__FILE__, __LINE__);
00090 msg += "Object " + std::string(m_Filter->GetNameOfClass()) + ": AbortGenerateDataOn";
00091 e.SetDescription(msg);
00092 throw e;
00093 }
00094 }
00095 }
00097
00098 protected:
00099 ProcessObject* m_Filter;
00100 int m_ThreadId;
00101 float m_InverseNumberOfPixels;
00102 unsigned long m_CurrentPixel;
00103 unsigned long m_PixelsPerUpdate;
00104 unsigned long m_PixelsBeforeUpdate;
00105 float m_InitialProgress;
00106 float m_ProgressWeight;
00107
00108 private:
00109 ProgressReporter();
00110
00111 };
00112
00113 }
00114
00115 #endif
00116