1 #ifndef __creaImageIOThreadedImageReader_h_INCLUDED__
2 #define __creaImageIOThreadedImageReader_h_INCLUDED__
4 #include <creaImageIOSystem.h>
5 #include <creaImageIOImageReader.h>
6 #include <creaImageIOIndexedHeap.h>
17 //=====================================================================
18 class ThreadedImageReader;
19 class MultiThreadImageReader;
20 //=====================================================================
22 //=====================================================================
23 class CREAIMAGEIO_EXPORT MultiThreadImageReaderUser
26 friend class ThreadedImageReader;
27 friend class MultiThreadImageReader;
29 MultiThreadImageReaderUser() {}
30 virtual ~MultiThreadImageReaderUser() {}
34 ThreadedReaderStarted,
35 ThreadedReaderStopped,
41 /// The virtual method to overload by MultiThreadImageReader users
42 /// It is called when an image has been loaded or unloaded
44 /// * The image file name which was requested
45 /// * The type of event
46 /// * If type==ImageLoaded the image pointer, else NULL pointer
47 virtual void OnMultiThreadImageReaderEvent( const std::string& filename,
51 inline void MultiThreadImageReaderEventLock()
52 { mMultiThreadImageReaderUserMutex.Lock(); }
53 inline void MultiThreadImageReaderEventUnlock()
54 { mMultiThreadImageReaderUserMutex.Unlock(); }
55 inline wxMutex& GetMultiThreadImageReaderUserMutex()
56 { return mMultiThreadImageReaderUserMutex; }
59 void MultiThreadImageReaderSendEvent( const std::string& filename,
62 wxMutex mMultiThreadImageReaderUserMutex;
64 //=====================================================================
66 //=====================================================================
68 /// TAKE CARE : For the moment it only supports a **SINGLE USER**
70 ///Class that allows parallel lectures of several images
71 class MultiThreadImageReader : public MultiThreadImageReaderUser
74 friend class ThreadedImageReader;
76 /// Ctor with the number of threads to use
77 MultiThreadImageReader(int number_of_threads = 1);
79 ~MultiThreadImageReader();
81 /// Starts the reader = create the threads which start to check
82 /// periodically the queue of requested images to read
84 /// Stops the reader = stops the threads and delete the images loaded
87 /// Request the image "filename" with a given priority
88 /// When the image is ready (or an error occurred)
89 /// The observer's callback is invoked
90 void Request( MultiThreadImageReaderUser* user,
91 const std::string& filename,
94 /// Request the image "filename" immediately
95 /// Blocks until image loaded
96 /// (no user callback but image returned)
97 vtkImageData* GetImage(const std::string& filename);
100 int GetMaximalPriority();
103 void OnMultiThreadImageReaderEvent( const std::string& filename,
105 vtkImageData* image);
108 int GetMaximalPriorityWithoutLocking();
109 ///Class that represents an image to be loaded
113 ImageToLoad( MultiThreadImageReaderUser* user,
114 const std::string& filename,
127 // std::cout << "Refs = "<<mImage->GetReferenceCount()<<std::endl;
131 MultiThreadImageReaderUser* GetUser() const { return mUser; }
132 void SetUser( MultiThreadImageReaderUser* u ) { mUser = u; }
133 const std::string& GetFilename() const { return mFilename; }
134 int GetPriority() const { return mPriority; }
135 void SetPriority(int p) { mPriority=p; }
136 int& Index() { return mIndex; }
137 int& UnloadIndex() { return mUnloadIndex; }
138 vtkImageData* GetImage() const { return mImage; }
139 void SetImage( vtkImageData* i ) { mImage=i; }
141 MultiThreadImageReaderUser* mUser;
142 std::string mFilename;
146 vtkImageData* mImage;
150 /// Type of pointer on an ImageToLoad struct
151 typedef ImageToLoad* ImageToLoadPtr;
153 /// ImageToLoadPtr comparator on priority (for image queue)
154 struct ImageToLoadPtrPriorityComparator
156 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
159 return ( a->GetPriority() > b->GetPriority() );
162 /// ImageToLoadPtr comparator on inverse priority (for image to unload queue)
163 struct ImageToLoadPtrInversePriorityComparator
165 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
168 return ( a->GetPriority() < b->GetPriority() );
173 /// ImageToLoadPtr comparator on filename (for image map)
174 struct ImageToLoadPtrFilenameComparator
176 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
179 return ( a->GetFilename() < b->GetFilename() );
183 /// ImageToLoadPtr indexer for image queue
184 struct ImageToLoadPtrIndexer
186 int& operator()(ImageToLoadPtr & t) const { return t->Index(); }
188 /// ImageToLoadPtr indexer for to unload image queue
189 struct ImageToUnloadPtrIndexer
191 int& operator()(ImageToLoadPtr & t) const { return t->UnloadIndex(); }
194 /// The callback from threaded readers when an image is read
195 void SignalImageRead(ImageToLoadPtr p, bool purge);
197 /// The type of map of images
198 typedef std::map<ImageToLoadPtr,vtkImageData*,
199 ImageToLoadPtrFilenameComparator> ImageMapType;
200 /// The map of images
201 ImageMapType mImages;
202 /// Comparator for the image to load queue
203 ImageToLoadPtrPriorityComparator mComparator;
204 /// Indexer for the image to load queue
205 ImageToLoadPtrIndexer mIndexer;
206 /// The image to load priority queue
207 IndexedHeap<ImageToLoadPtr,
208 ImageToLoadPtrPriorityComparator,
209 ImageToLoadPtrIndexer> mQueue;
211 /// The type of list of threaded readers
212 typedef std::vector<ThreadedImageReader*> ThreadedImageReaderListType;
213 ThreadedImageReaderListType mThreadedImageReaderList;
214 /// The number of currently running threaded readers
215 int mNumberOfThreadedReadersRunning;
216 /// The mutex used to access safely internal data from any thread
217 /// LG : Removed ! We now use the embedded mutex in User from which
221 /// For GetImage : the filename requested
222 std::string mRequestedFilename;
223 /// For GetImage : the image requested
224 vtkImageData* mRequestedImage;
226 /// If number of threads == 0 then uses an internal non-threaded reader
227 ImageReader* mReader;
229 /// The type of list of images loaded
230 /// used to unload oldest image when memory limit exceeded
231 /// The image to unload priority queue
232 IndexedHeap<ImageToLoadPtr,
233 ImageToLoadPtrInversePriorityComparator,
234 ImageToUnloadPtrIndexer> mUnloadQueue;
236 void UpdateUnloadPriority(ImageToLoadPtr p, int priority);
241 }; // class MultiThreadImageReader
242 //=====================================================================
246 } // namespace creaImageIO
250 #endif // #ifndef __creaImageIOThreadedImageReader_h_INCLUDED__