[Interest] Async QQuickImageResponse

Neubert Stefan NES at hekatron.de
Fri Sep 16 11:41:08 CEST 2016


Hi everyone,

for a QtQuick application I try to implement an asynchronous image provider.
As suggested in the documentation of QQuickImageResponse I use QRunnable as
base class and disabled automatic deletion in the constructor.

I have a private QThreadPool member in my QQuickAsyncImageProvider.
My requestImageResponse function creates a new ImageResponse, calling
the ThreadPool´s start function for the ImageResponse and returns the
ImageResponse.

The run method of the ImageResponse renders a pdf page with poppler, sets
the QQuickTextureFactory and emits finished.

To display the pdf pages I use a ListModel with all pages displayed as
Images in a PathView. To display different pdf´s i use a StackView.

If I push a pdf view on the StackView I can see the construction, run,
finished, textureFactory and destruction calls of the ImageResponse.
In the ImageResponse I added qDebug() prints for all public functions.
The pages get displayed correctly in my pdf view.

If I pop the pdf view from the StackView before all pages have been rendered
the application crashes.
I can see a call to cancel and destructor of the pages that have not signaled
finished. To eliminate side effects, I replaced the pdf rendering in run with
a sleep of 1 second.

Here is the output of a 7 page pdf view (the second column is the requested
id (fileName:pageNumber), stored in a private member of ImageRequest):

QML debugging is enabled. Only use this in a safe environment.
constructor:    "test.pdf:4"
constructor:    "test.pdf:5"
run:            "test.pdf:4"
constructor:    "test.pdf:6"
run:            "test.pdf:5"
constructor:    "test.pdf:3"
constructor:    "test.pdf:2"
constructor:    "test.pdf:1"
run:            "test.pdf:3"
constructor:    "test.pdf:0"
run:            "test.pdf:6"
run finished:   "test.pdf:4"
run:            "test.pdf:2"
run finished:   "test.pdf:5"
textureFactory:         "test.pdf:4"
run:            "test.pdf:1"
textureFactory:         "test.pdf:5"
destructor:     "test.pdf:4"
run finished:   "test.pdf:3"
run:            "test.pdf:0"
destructor:     "test.pdf:5"
textureFactory:         "test.pdf:3"
destructor:     "test.pdf:3"
run finished:   "test.pdf:6"
textureFactory:         "test.pdf:6"
destructor:     "test.pdf:6"
cancle:                 "test.pdf:0"
destructor:     "test.pdf:0"
cancle:                 "test.pdf:1"
cancle:                 "test.pdf:2"
destructor:     "test.pdf:1"
destructor:     "test.pdf:2"
run finished:   "test.pdf:2"
run finished:   "test.pdf:1"
bash: line 1: 14884 Segmentation fault      DISPLAY=':0.0' QT_QPA_EGLFS_PHYSICAL_HEIGHT='268.11' QT_QPA_EGLFS_PHYSICAL_WIDTH='476.64' /home/pi/test/test

The only thing I can spot is the destruction of ImageRequests that have been started but not finished
(the last 4 lines before the segmentation fault).

Do I miss something or is this a bug?

Regards

Stefan

HEKATRON Technik GmbH
Bruehlmatten 3a - 9
D-79295 Sulzburg
Reg.-Ger. Freiburg HRB 300243
Geschaeftsfuehrer:
Michael Roth, Armin Berchtold
Telefon +49 7634 500-0
Telefax +49 7634 500-316



More information about the Interest mailing list