00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __itkThreadLogger_h
00019 #define __itkThreadLogger_h
00020
00021 #include "itkMacro.h"
00022 #include "itkMultiThreader.h"
00023 #include "itkLogger.h"
00024 #include "itkSimpleFastMutexLock.h"
00025
00026 #include <string>
00027 #include <queue>
00028
00029 namespace itk
00030 {
00043 class ITKCommon_EXPORT ThreadLogger : public Logger
00044 {
00045
00046 public:
00047
00048 typedef ThreadLogger Self;
00049 typedef Logger Superclass;
00050 typedef SmartPointer<Self> Pointer;
00051 typedef SmartPointer<const Self> ConstPointer;
00052
00054 itkTypeMacro( ThreadLogger, Logger );
00055
00057 itkNewMacro( Self );
00058
00059 typedef Logger::OutputType OutputType;
00060
00061 typedef Logger::PriorityLevelType PriorityLevelType;
00062
00064 typedef enum
00065 {
00066 SET_PRIORITY_LEVEL,
00067 SET_LEVEL_FOR_FLUSHING,
00068 ADD_LOG_OUTPUT,
00069 WRITE,
00070 FLUSH
00071 } OperationType;
00072
00073
00077 virtual void SetPriorityLevel( PriorityLevelType level );
00078
00082 virtual PriorityLevelType GetPriorityLevel() const;
00083
00084 virtual void SetLevelForFlushing( PriorityLevelType level );
00085
00086 virtual PriorityLevelType GetLevelForFlushing() const;
00087
00089 virtual void AddLogOutput( OutputType* output );
00090
00091 virtual void Write(PriorityLevelType level, std::string const & content);
00092
00093 virtual void Flush();
00094
00095 protected:
00096
00098 ThreadLogger();
00099
00101 virtual ~ThreadLogger();
00102
00104 virtual void PrintSelf(std::ostream &os, Indent indent) const;
00105
00106 static ITK_THREAD_RETURN_TYPE ThreadFunction(void*);
00107
00108 private:
00109
00110 typedef std::queue<OperationType> OperationContainerType;
00111
00112 typedef std::queue<std::string> MessageContainerType;
00113
00114 typedef std::queue<PriorityLevelType> LevelContainerType;
00115
00116 typedef std::queue<OutputType::Pointer> OutputContainerType;
00117
00118 MultiThreader::Pointer m_Threader;
00119
00120 int m_ThreadID;
00121
00122 OperationContainerType m_OperationQ;
00123
00124 MessageContainerType m_MessageQ;
00125
00126 LevelContainerType m_LevelQ;
00127
00128 OutputContainerType m_OutputQ;
00129
00130 SimpleFastMutexLock m_Mutex;
00131
00132 SimpleFastMutexLock m_WaitMutex;
00133
00134 };
00135
00136
00137 }
00138
00139
00140 #endif // __itkThreadLogger_h
00141