QPixmap реентерабелен?
У меня есть программа, которая должна загрузить много QPixmaps. Я разделил загрузку растровых изображений на несколько заданий, используя QtConcurrent::mappedReduced
(Я на самом деле загружаю кучу QGraphicPixmapItem
с). Функция загрузки вызывает только конструкторы QPixmap
s /QGraphicItem
s, он не пытается выполнить какой-либо рисунок, и он не связывается с остальным миром (по крайней мере, через мой код), пока загрузка не будет завершена.
Я получаю некоторые случайные сбои во время инициализации (скажем, 1% случаев), и Helgrind жалуется на неохраняемый доступ к QApplication
от QPixmap
и из основного цикла событий, но известно, что мьютексы Qt, как правило, не очень хорошо смешиваются с valgrind, так что это может быть ложным срабатыванием.
Как обычно, в документации Qt неясно, QPixmap
реентерируемый или нет, это в основном мой вопрос.
1 ответ
Ну, у вас происходит сбой и вы спрашиваете, все ли в порядке? Вы уже знаете ответ. Это не хорошо.
Единственный вопрос, который я вижу здесь, это ошибка Qt. Нет, это не так.
Если вы хотите загрузить много растровых изображений, загрузите их в QImages
, а затем преобразовать их в формат резервного хранилища. В наши дни не так уж много можно извлечь из использования растрового изображения поверх изображения. Пока изображение имеет тот же формат, что и хранилище резервных копий виджета (приведено к QImage
), у вас будет такая же производительность. QPixmap
Различие имело смысл, когда Qt все еще использовал нативную живопись. В Windows и OS X растровое изображение просто правильно отформатировано QImage
,