1 #ifndef __creaImageIOThreadedImageReader_h_INCLUDED__
2 #define __creaImageIOThreadedImageReader_h_INCLUDED__
4 #include <creaImageIOSystem.h>
5 #include <creaImageIOImageReader.h>
6 #include <creaImageIOIndexedHeap.h>
19 //=====================================================================
20 class ThreadedImageReader;
21 class MultiThreadImageReader;
22 //=====================================================================
24 //=====================================================================
25 class CREAIMAGEIO_EXPORT MultiThreadImageReaderUser
28 friend class ThreadedImageReader;
29 friend class MultiThreadImageReader;
31 MultiThreadImageReaderUser() {}
32 virtual ~MultiThreadImageReaderUser() {}
36 ThreadedReaderStarted,
37 ThreadedReaderStopped,
43 /// The virtual method to overload by MultiThreadImageReader users
44 /// It is called when an image has been loaded or unloaded
46 /// * The image file name which was requested
47 /// * The type of event
48 /// * If type==ImageLoaded the image pointer, else NULL pointer
49 virtual void OnMultiThreadImageReaderEvent( const std::string& filename,
53 inline void MultiThreadImageReaderEventLock()
54 { mMultiThreadImageReaderUserMutex.Lock(); }
55 inline void MultiThreadImageReaderEventUnlock()
56 { mMultiThreadImageReaderUserMutex.Unlock(); }
57 inline wxMutex& GetMultiThreadImageReaderUserMutex()
58 { return mMultiThreadImageReaderUserMutex; }
61 void MultiThreadImageReaderSendEvent( const std::string& filename,
64 wxMutex mMultiThreadImageReaderUserMutex;
66 //=====================================================================
68 //=====================================================================
70 /// TAKE CARE : For the moment it only supports a **SINGLE USER**
72 ///Class that allows parallel lectures of several images
73 class MultiThreadImageReader : public MultiThreadImageReaderUser
76 friend class ThreadedImageReader;
78 /// Ctor with the number of threads to use
79 MultiThreadImageReader(int number_of_threads = 1);
81 ~MultiThreadImageReader();
83 /// Starts the reader = create the threads which start to check
84 /// periodically the queue of requested images to read
86 /// Stops the reader = stops the threads and delete the images loaded
89 /// Request the image "filename" with a given priority
90 /// When the image is ready (or an error occurred)
91 /// The observer's callback is invoked
92 void Request( MultiThreadImageReaderUser* user,
93 const std::string& filename,
96 /// Request the image "filename" immediately
97 /// Blocks until image loaded
98 /// (no user callback but image returned)
99 vtkImageData* GetImage(const std::string& filename);
102 int GetMaximalPriority();
105 void OnMultiThreadImageReaderEvent( const std::string& filename,
107 vtkImageData* image);
111 int GetMaximalPriorityWithoutLocking();
112 ///Class that represents an image to be loaded
116 ImageToLoad( MultiThreadImageReaderUser* user,
117 const std::string& filename,
130 // std::cout << "Refs = "<<mImage->GetReferenceCount()<<std::endl;
134 MultiThreadImageReaderUser* GetUser() const { return mUser; }
135 void SetUser( MultiThreadImageReaderUser* u ) { mUser = u; }
136 const std::string& GetFilename() const { return mFilename; }
137 int GetPriority() const { return mPriority; }
138 void SetPriority(int p) { mPriority=p; }
139 int& Index() { return mIndex; }
140 int& UnloadIndex() { return mUnloadIndex; }
141 vtkImageData* GetImage() const { return mImage; }
142 void SetImage( vtkImageData* i ) { mImage=i; }
144 MultiThreadImageReaderUser* mUser;
145 std::string mFilename;
149 vtkImageData* mImage;
153 /// Type of pointer on an ImageToLoad struct
154 typedef ImageToLoad* ImageToLoadPtr;
156 /// ImageToLoadPtr comparator on priority (for image queue)
157 struct ImageToLoadPtrPriorityComparator
159 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
162 return ( a->GetPriority() > b->GetPriority() );
165 /// ImageToLoadPtr comparator on inverse priority (for image to unload queue)
166 struct ImageToLoadPtrInversePriorityComparator
168 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
171 return ( a->GetPriority() < b->GetPriority() );
176 /// ImageToLoadPtr comparator on filename (for image map)
177 struct ImageToLoadPtrFilenameComparator
179 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
182 return ( a->GetFilename() < b->GetFilename() );
186 /// ImageToLoadPtr indexer for image queue
187 struct ImageToLoadPtrIndexer
189 int& operator()(ImageToLoadPtr & t) const { return t->Index(); }
191 /// ImageToLoadPtr indexer for to unload image queue
192 struct ImageToUnloadPtrIndexer
194 int& operator()(ImageToLoadPtr & t) const { return t->UnloadIndex(); }
197 /// The callback from threaded readers when an image is read
198 void SignalImageRead(ImageToLoadPtr p, bool purge);
200 /// The type of map of images
201 typedef std::map<ImageToLoadPtr,vtkImageData*,
202 ImageToLoadPtrFilenameComparator> ImageMapType;
203 /// The map of images
204 ImageMapType mImages;
205 /// Comparator for the image to load queue
206 ImageToLoadPtrPriorityComparator mComparator;
207 /// Indexer for the image to load queue
208 ImageToLoadPtrIndexer mIndexer;
209 /// The image to load priority queue
210 IndexedHeap<ImageToLoadPtr,
211 ImageToLoadPtrPriorityComparator,
212 ImageToLoadPtrIndexer> mQueue;
214 /// The type of list of threaded readers
215 typedef std::vector<boost::shared_ptr<ThreadedImageReader> > ThreadedImageReaderListType;
216 //typedef std::vector<ThreadedImageReader* > ThreadedImageReaderListType;
217 ThreadedImageReaderListType mThreadedImageReaderList;
218 /// The number of currently running threaded readers
219 int mNumberOfThreadedReadersRunning;
220 /// The mutex used to access safely internal data from any thread
221 /// LG : Removed ! We now use the embedded mutex in User from which
225 /// For GetImage : the filename requested
226 std::string mRequestedFilename;
227 /// For GetImage : the image requested
228 vtkImageData* mRequestedImage;
230 /// If number of threads == 0 then uses an internal non-threaded reader
231 ImageReader* mReader;
233 /// The type of list of images loaded
234 /// used to unload oldest image when memory limit exceeded
235 /// The image to unload priority queue
236 IndexedHeap<ImageToLoadPtr,
237 ImageToLoadPtrInversePriorityComparator,
238 ImageToUnloadPtrIndexer> mUnloadQueue;
240 void UpdateUnloadPriority(ImageToLoadPtr p, int priority);
245 }; // class MultiThreadImageReader
246 //=====================================================================
250 } // namespace creaImageIO
254 #endif // #ifndef __creaImageIOThreadedImageReader_h_INCLUDED__