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 /// (no callback but image returned)
92 vtkImageData* GetImage(const std::string& filename);
95 int GetMaximalPriority();
98 void OnMultiThreadImageReaderEvent( const std::string& filename,
100 vtkImageData* image);
103 int GetMaximalPriorityWithoutLocking();
108 ImageToLoad( MultiThreadImageReaderUser* user,
109 const std::string& filename,
122 // std::cout << "Refs = "<<mImage->GetReferenceCount()<<std::endl;
126 MultiThreadImageReaderUser* GetUser() const { return mUser; }
127 void SetUser( MultiThreadImageReaderUser* u ) { mUser = u; }
128 const std::string& GetFilename() const { return mFilename; }
129 int GetPriority() const { return mPriority; }
130 void SetPriority(int p) { mPriority=p; }
131 int& Index() { return mIndex; }
132 int& UnloadIndex() { return mUnloadIndex; }
133 vtkImageData* GetImage() const { return mImage; }
134 void SetImage( vtkImageData* i ) { mImage=i; }
136 MultiThreadImageReaderUser* mUser;
137 std::string mFilename;
141 vtkImageData* mImage;
145 /// Type of pointer on an ImageToLoad struct
146 typedef ImageToLoad* ImageToLoadPtr;
148 /// ImageToLoadPtr comparator on priority (for image queue)
149 struct ImageToLoadPtrPriorityComparator
151 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
154 return ( a->GetPriority() > b->GetPriority() );
157 /// ImageToLoadPtr comparator on inverse priority (for image to unload queue)
158 struct ImageToLoadPtrInversePriorityComparator
160 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
163 return ( a->GetPriority() < b->GetPriority() );
168 /// ImageToLoadPtr comparator on filename (for image map)
169 struct ImageToLoadPtrFilenameComparator
171 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
174 return ( a->GetFilename() < b->GetFilename() );
178 /// ImageToLoadPtr indexer for image queue
179 struct ImageToLoadPtrIndexer
181 int& operator()(ImageToLoadPtr & t) const { return t->Index(); }
183 /// ImageToLoadPtr indexer for to unload image queue
184 struct ImageToUnloadPtrIndexer
186 int& operator()(ImageToLoadPtr & t) const { return t->UnloadIndex(); }
189 /// The callback from threaded readers when an image is read
190 void SignalImageRead(ImageToLoadPtr p, bool purge);
192 /// The type of map of images
193 typedef std::map<ImageToLoadPtr,vtkImageData*,
194 ImageToLoadPtrFilenameComparator> ImageMapType;
195 /// The map of images
196 ImageMapType mImages;
197 /// Comparator for the image to load queue
198 ImageToLoadPtrPriorityComparator mComparator;
199 /// Indexer for the image to load queue
200 ImageToLoadPtrIndexer mIndexer;
201 /// The image to load priority queue
202 IndexedHeap<ImageToLoadPtr,
203 ImageToLoadPtrPriorityComparator,
204 ImageToLoadPtrIndexer> mQueue;
206 /// The type of list of threaded readers
207 typedef std::vector<ThreadedImageReader*> ThreadedImageReaderListType;
208 ThreadedImageReaderListType mThreadedImageReaderList;
209 /// The number of currently running threaded readers
210 int mNumberOfThreadedReadersRunning;
211 /// The mutex used to access safely internal data from any thread
212 /// LG : Removed ! We now use the embedded mutex in User from which
216 /// For GetImage : the filename requested
217 std::string mRequestedFilename;
218 /// For GetImage : the image requested
219 vtkImageData* mRequestedImage;
221 /// If number of threads == 0 then uses an internal non-threaded reader
222 ImageReader* mReader;
224 /// The type of list of images loaded
225 /// used to unload oldest image when memory limit exceeded
226 /// The image to unload priority queue
227 IndexedHeap<ImageToLoadPtr,
228 ImageToLoadPtrInversePriorityComparator,
229 ImageToUnloadPtrIndexer> mUnloadQueue;
231 void UpdateUnloadPriority(ImageToLoadPtr p, int priority);
236 }; // class MultiThreadImageReader
237 //=====================================================================
241 } // namespace creaImageIO
245 #endif // #ifndef __creaImageIOThreadedImageReader_h_INCLUDED__