1 #ifndef __creaImageIOThreadedImageReader_h_INCLUDED__
2 #define __creaImageIOThreadedImageReader_h_INCLUDED__
4 #include <creaImageIOSystem.h>
5 #include <creaImageIOImageReader.h>
6 #include <creaImageIOIndexedHeap.h>
15 //=====================================================================
16 class ThreadedImageReader;
17 class MultiThreadImageReader;
18 //=====================================================================
20 //=====================================================================
21 class CREAIMAGEIO_EXPORT MultiThreadImageReaderUser
24 friend class ThreadedImageReader;
25 friend class MultiThreadImageReader;
27 MultiThreadImageReaderUser() {}
28 virtual ~MultiThreadImageReaderUser() {}
32 ThreadedReaderStarted,
33 ThreadedReaderStopped,
39 /// The virtual method to overload by MultiThreadImageReader users
40 /// It is called when an image has been loaded or unloaded
42 /// * The image file name which was requested
43 /// * The type of event
44 /// * If type==ImageLoaded the image pointer, else NULL pointer
45 virtual void OnMultiThreadImageReaderEvent( const std::string& filename,
49 inline void MultiThreadImageReaderEventLock()
50 { mMultiThreadImageReaderUserMutex.Lock(); }
51 inline void MultiThreadImageReaderEventUnlock()
52 { mMultiThreadImageReaderUserMutex.Unlock(); }
53 inline wxMutex& GetMultiThreadImageReaderUserMutex()
54 { return mMultiThreadImageReaderUserMutex; }
57 void MultiThreadImageReaderSendEvent( const std::string& filename,
60 wxMutex mMultiThreadImageReaderUserMutex;
62 //=====================================================================
64 //=====================================================================
66 /// TAKE CARE : For the moment it only supports a **SINGLE USER**
67 class MultiThreadImageReader : public MultiThreadImageReaderUser
70 friend class ThreadedImageReader;
72 /// Ctor with the number of threads to use
73 MultiThreadImageReader(int number_of_threads = 1);
75 ~MultiThreadImageReader();
77 /// Starts the reader = create the threads which start to check
78 /// periodically the queue of requested images to read
80 /// Stops the reader = stops the threads and delete the images loaded
83 /// Request the image "filename" with a given priority
84 /// When the image is ready (or an error occurred)
85 /// The observer's callback is invoked
86 void Request( MultiThreadImageReaderUser* user,
87 const std::string& filename,
90 /// Request the image "filename" immediately
91 /// Blocks until image loaded
92 /// (no user callback but image returned)
93 vtkImageData* GetImage(const std::string& filename);
96 int GetMaximalPriority();
99 void OnMultiThreadImageReaderEvent( const std::string& filename,
101 vtkImageData* image);
104 int GetMaximalPriorityWithoutLocking();
109 ImageToLoad( MultiThreadImageReaderUser* user,
110 const std::string& filename,
123 // std::cout << "Refs = "<<mImage->GetReferenceCount()<<std::endl;
127 MultiThreadImageReaderUser* GetUser() const { return mUser; }
128 void SetUser( MultiThreadImageReaderUser* u ) { mUser = u; }
129 const std::string& GetFilename() const { return mFilename; }
130 int GetPriority() const { return mPriority; }
131 void SetPriority(int p) { mPriority=p; }
132 int& Index() { return mIndex; }
133 int& UnloadIndex() { return mUnloadIndex; }
134 vtkImageData* GetImage() const { return mImage; }
135 void SetImage( vtkImageData* i ) { mImage=i; }
137 MultiThreadImageReaderUser* mUser;
138 std::string mFilename;
142 vtkImageData* mImage;
146 /// Type of pointer on an ImageToLoad struct
147 typedef ImageToLoad* ImageToLoadPtr;
149 /// ImageToLoadPtr comparator on priority (for image queue)
150 struct ImageToLoadPtrPriorityComparator
152 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
155 return ( a->GetPriority() > b->GetPriority() );
158 /// ImageToLoadPtr comparator on inverse priority (for image to unload queue)
159 struct ImageToLoadPtrInversePriorityComparator
161 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
164 return ( a->GetPriority() < b->GetPriority() );
169 /// ImageToLoadPtr comparator on filename (for image map)
170 struct ImageToLoadPtrFilenameComparator
172 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
175 return ( a->GetFilename() < b->GetFilename() );
179 /// ImageToLoadPtr indexer for image queue
180 struct ImageToLoadPtrIndexer
182 int& operator()(ImageToLoadPtr & t) const { return t->Index(); }
184 /// ImageToLoadPtr indexer for to unload image queue
185 struct ImageToUnloadPtrIndexer
187 int& operator()(ImageToLoadPtr & t) const { return t->UnloadIndex(); }
190 /// The callback from threaded readers when an image is read
191 void SignalImageRead(ImageToLoadPtr p, bool purge);
193 /// The type of map of images
194 typedef std::map<ImageToLoadPtr,vtkImageData*,
195 ImageToLoadPtrFilenameComparator> ImageMapType;
196 /// The map of images
197 ImageMapType mImages;
198 /// Comparator for the image to load queue
199 ImageToLoadPtrPriorityComparator mComparator;
200 /// Indexer for the image to load queue
201 ImageToLoadPtrIndexer mIndexer;
202 /// The image to load priority queue
203 IndexedHeap<ImageToLoadPtr,
204 ImageToLoadPtrPriorityComparator,
205 ImageToLoadPtrIndexer> mQueue;
207 /// The type of list of threaded readers
208 typedef std::vector<ThreadedImageReader*> ThreadedImageReaderListType;
209 ThreadedImageReaderListType mThreadedImageReaderList;
210 /// The number of currently running threaded readers
211 int mNumberOfThreadedReadersRunning;
212 /// The mutex used to access safely internal data from any thread
213 /// LG : Removed ! We now use the embedded mutex in User from which
217 /// For GetImage : the filename requested
218 std::string mRequestedFilename;
219 /// For GetImage : the image requested
220 vtkImageData* mRequestedImage;
222 /// If number of threads == 0 then uses an internal non-threaded reader
223 ImageReader* mReader;
225 /// The type of list of images loaded
226 /// used to unload oldest image when memory limit exceeded
227 /// The image to unload priority queue
228 IndexedHeap<ImageToLoadPtr,
229 ImageToLoadPtrInversePriorityComparator,
230 ImageToUnloadPtrIndexer> mUnloadQueue;
232 void UpdateUnloadPriority(ImageToLoadPtr p, int priority);
237 }; // class MultiThreadImageReader
238 //=====================================================================
242 } // namespace creaImageIO
246 #endif // #ifndef __creaImageIOThreadedImageReader_h_INCLUDED__