@@ -158,40 +158,63 @@ def load_from_memory(self): # consumer slot
158
158
logzero .logger .error ("Image data was corrupted." )
159
159
160
160
161
- def producer_scope_test (path ):
161
+ def producer_repetitive_scope_test (path , repetitions = 1 , delay = 0 ): # producer with repetitive writes to shared memory
162
162
import time
163
+ from PyQt5 .QtGui import QPainter , QPixmap , QColor , QFont , QPen
164
+ from PyQt5 .QtCore import Qt
163
165
from prodcon_ipc .producer_ipc import ProducerIPC
166
+
167
+ # FIXME: this is still buggy because when the images are not read sufficiently fast from the consumer (which
168
+ # only (?) happens in the non-async Python consumer), image data gets corrupted (may be overwritten by the
169
+ # producer?! but this SHOULD be prevented by the system semaphores and the producer/consumer sync...)
170
+
164
171
producer_ipc = ProducerIPC ()
165
- image = QImage ()
166
- if not image .load (path ):
167
- logzero .logger .error ("Unable to load image " + path )
168
- sys .exit (1 )
169
- else :
170
- # Load the image:
171
- buf = QBuffer ()
172
- buf .open (QBuffer .ReadWrite )
173
- out = QDataStream (buf )
174
- out << image
172
+ for i in range (repetitions ):
173
+ image = QImage ()
174
+ if not image .load (path ):
175
+ logzero .logger .error ("Unable to load image " + path )
176
+ sys .exit (1 )
177
+ else :
178
+ pm = QPixmap .fromImage (image ) # .convertToFormat(QImage.Format_RGB32)
175
179
176
- try :
177
- avail_size , mem_data = producer_ipc .begin (buf .size ())
178
- except RuntimeError as err :
179
- logzero .logger .error (str (err ))
180
- sys .exit (2 )
180
+ p = QPainter ()
181
+ p .begin (pm )
182
+ p .setPen (QPen (Qt .yellow ))
183
+ p .setFont (QFont ("Times" , 20 , QFont .Bold ))
184
+ p .drawText (pm .rect (), Qt .AlignCenter , str (i + 1 ) + " of " + str (repetitions ))
185
+ p .end ()
181
186
182
- # Copy image data from buf into shared memory area:
183
- error_str = None
184
- try :
185
- mem_data [:avail_size ] = buf .data ().data ()[:avail_size ]
186
- except Exception as err :
187
- logzero .logger .error (str (err ))
188
- sys .exit (3 )
187
+ image = pm .toImage ()
189
188
190
- try :
191
- producer_ipc .end ()
192
- except RuntimeError as err :
193
- logzero .logger .error (str (err ))
194
- sys .exit (3 )
189
+ # Load the image:
190
+ buf = QBuffer ()
191
+ buf .open (QBuffer .ReadWrite )
192
+ out = QDataStream (buf )
193
+ out << image
194
+
195
+ try :
196
+ avail_size , mem_data = producer_ipc .begin (buf .size ())
197
+ if avail_size < buf .size ():
198
+ logzero .logger .warn ("Couldn't get enough memory!" )
199
+ except RuntimeError as err :
200
+ logzero .logger .error (str (err ))
201
+ sys .exit (2 )
202
+
203
+ # Copy image data from buf into shared memory area:
204
+ error_str = None
205
+ try :
206
+ mem_data [:avail_size ] = buf .data ().data ()[:avail_size ]
207
+ except Exception as err :
208
+ logzero .logger .error (str (err ))
209
+
210
+ try :
211
+ producer_ipc .end ()
212
+ except RuntimeError as err :
213
+ logzero .logger .error (str (err ))
214
+ sys .exit (3 )
215
+ if delay > 0 :
216
+ time .sleep (delay )
217
+ logzero .logger .debug ("Iteration " + str (i + 1 ) + " of " + str (repetitions ) + " completed." )
195
218
196
219
logzero .logger .info ("All okay" )
197
220
# IMPORTANT: The object should NOT go out of scope until the consumer has read the data, so (also) dont call:
@@ -206,13 +229,15 @@ def producer_scope_test(path):
206
229
207
230
208
231
if __name__ == '__main__' :
232
+ app = QApplication (sys .argv )
233
+
209
234
if 'consumer' in sys .argv :
210
235
CONSUMER = 1
211
236
elif 'producer' in sys .argv :
212
237
CONSUMER = 0
213
238
elif len (sys .argv ) > 1 and os .path .exists (sys .argv [1 ]) and (sys .argv [1 ].endswith ('.png' ) or
214
239
sys .argv [1 ].endswith ('.jpg' )):
215
- producer_scope_test (sys .argv [1 ])
240
+ producer_repetitive_scope_test (sys .argv [1 ], 5 , 0 )
216
241
217
242
logzero .logger .debug ("I am the " + ('consumer.' if CONSUMER == 1 else 'producer.' ))
218
243
0 commit comments