Skip to content

Commit 900c704

Browse files
committed
Add (yet failing) repetitive test case
TODO: this still fails on the consumer side with "Image data was corrupted", see FIXME in shared_memory.py. It is not clear why this is happening.
1 parent 3dea9e7 commit 900c704

File tree

1 file changed

+54
-29
lines changed

1 file changed

+54
-29
lines changed

shared_memory.py

+54-29
Original file line numberDiff line numberDiff line change
@@ -158,40 +158,63 @@ def load_from_memory(self): # consumer slot
158158
logzero.logger.error("Image data was corrupted.")
159159

160160

161-
def producer_scope_test(path):
161+
def producer_repetitive_scope_test(path, repetitions=1, delay=0): # producer with repetitive writes to shared memory
162162
import time
163+
from PyQt5.QtGui import QPainter, QPixmap, QColor, QFont, QPen
164+
from PyQt5.QtCore import Qt
163165
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+
164171
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)
175179

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()
181186

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()
189188

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.")
195218

196219
logzero.logger.info("All okay")
197220
# 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):
206229

207230

208231
if __name__ == '__main__':
232+
app = QApplication(sys.argv)
233+
209234
if 'consumer' in sys.argv:
210235
CONSUMER = 1
211236
elif 'producer' in sys.argv:
212237
CONSUMER = 0
213238
elif len(sys.argv) > 1 and os.path.exists(sys.argv[1]) and (sys.argv[1].endswith('.png') or
214239
sys.argv[1].endswith('.jpg')):
215-
producer_scope_test(sys.argv[1])
240+
producer_repetitive_scope_test(sys.argv[1], 5, 0)
216241

217242
logzero.logger.debug("I am the " + ('consumer.' if CONSUMER == 1 else 'producer.'))
218243

0 commit comments

Comments
 (0)