Salome HOME
Fix for Bug IPAL8945
[modules/visu.git] / src / VVTK / VVTK_ImageWriterMgr.cxx
1 //  SALOME VTKViewer : build VTK viewer into Salome desktop\r
2 //\r
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,\r
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS \r
5 // \r
6 //  This library is free software; you can redistribute it and/or \r
7 //  modify it under the terms of the GNU Lesser General Public \r
8 //  License as published by the Free Software Foundation; either \r
9 //  version 2.1 of the License. \r
10 // \r
11 //  This library is distributed in the hope that it will be useful, \r
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of \r
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU \r
14 //  Lesser General Public License for more details. \r
15 // \r
16 //  You should have received a copy of the GNU Lesser General Public \r
17 //  License along with this library; if not, write to the Free Software \r
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA \r
19 // \r
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org \r
21 //\r
22 //\r
23 //\r
24 //  File   :\r
25 //  Author :\r
26 //  Module :\r
27 //  $Header$\r
28 \r
29 #include "VVTK_ImageWriterMgr.h"\r
30 #include "VVTK_ImageWriter.h"\r
31 \r
32 #include <vtkImageData.h>\r
33 \r
34 #include <qsemaphore.h>\r
35 \r
36 #include <limits>\r
37 \r
38 \r
39 #ifdef _DEBUG_\r
40 static int MYDEBUG = 0;\r
41 #else\r
42 static int MYDEBUG = 0;\r
43 #endif\r
44 \r
45 //----------------------------------------------------------------------------\r
46 VVTK_ImageWriterMgr\r
47 ::VVTK_ImageWriterMgr()\r
48 {\r
49   int aMax = std::numeric_limits<int>::max() / 2;\r
50   mySemaphore = new QSemaphore(aMax);\r
51   *mySemaphore += aMax;\r
52   if(MYDEBUG) cout<<"VVTK_ImageWriterMgr::VVTK_ImageWriterMgr "<<\r
53                 "- total = "<<mySemaphore->total()<<\r
54                 "; available = "<<mySemaphore->available()<<endl;\r
55 }\r
56 \r
57 \r
58 //----------------------------------------------------------------------------\r
59 VVTK_ImageWriterMgr\r
60 ::~VVTK_ImageWriterMgr()\r
61 {\r
62   Stop();\r
63   delete mySemaphore;\r
64 }\r
65 \r
66 \r
67 //----------------------------------------------------------------------------\r
68 void\r
69 VVTK_ImageWriterMgr\r
70 ::StartImageWriter(vtkImageData *theImageData,\r
71                    const std::string& theName,\r
72                    const int theProgressive,\r
73                    const int theQuality)\r
74 {\r
75   VVTK_ImageWriter *anImageWriter = \r
76     new VVTK_ImageWriter(mySemaphore,\r
77                          theImageData,\r
78                          theName,\r
79                          theProgressive,\r
80                          theQuality);\r
81   myThreads.push_back(anImageWriter);\r
82 \r
83   anImageWriter->start();\r
84 \r
85 }\r
86 \r
87 \r
88 //----------------------------------------------------------------------------\r
89 void\r
90 VVTK_ImageWriterMgr\r
91 ::Stop()\r
92 {\r
93   if(MYDEBUG) cout<<"VVTK_ImageWriterMgr::Stop "<<\r
94                 "- total = "<<mySemaphore->total()<<\r
95                 "; available = "<<mySemaphore->available()<<endl;\r
96   if(MYDEBUG) cout<<"VVTK_ImageWriterMgr::Stop - *mySemaphore += "<<myThreads.size()<<endl;\r
97   *mySemaphore += myThreads.size();\r
98 \r
99   for(size_t anId = 0, anEnd = myThreads.size(); anId < anEnd; anId++){\r
100     VVTK_ImageWriter* anImageWriter = myThreads[anId];\r
101     anImageWriter->wait();\r
102     delete anImageWriter;\r
103   }\r
104   myThreads.clear();\r
105 }\r