Pixmap разделяется между потоками в Qt

У меня есть основной класс GUI и другой класс Worker: первый справляется с вещами GUI (рисует QPixmap в QGraphicsScene), вторая с вычислениями вещь (рисунок QLineс и QPointна это QPixmap).
Два класса работают в двух разных потоках.
Когда я создаю Worker нить, я передаю адрес графического интерфейса QPixmap к Worker класс, поэтому они разделяют один и тот же объект.

QPixmap модифицируется в Worker класс, и обращается в GUI учебный класс. Даже если у меня не было никаких проблем, я решил использовать QMutex чтобы моя программа не пыталась получить доступ к QPixmap пока он рисовался. Теперь, чтобы сделать это, у меня есть QMutex разделены между классом GUI и Worker учебный класс (Worker класс снова имеет указатель на графический интерфейс QMutex). Всякий раз, когда я читаю или изменяю QPixmap Я блокирую QMutex,

Это правильный подход? До сих пор я не получал ошибок, но мне интересно, является ли это логически правильным и предоставляет ли Qt лучший способ сделать это.

Заранее спасибо.

2

Решение

Согласно Qt5 потокобезопасная страница:

QPainter может использоваться в потоке для рисования на QImage, QPrinter и
QPicture окраска устройства. Рисование на QPixmaps и QWidgets не
поддерживается.

Так что официальная строка — нет, вы не должны изменять QPixmap вне основного потока. Возможно, вам «повезло» в том, что это работает на вашей текущей платформе при вашем текущем сценарии использования, но Qt не гарантирует, что это будет работать.

Более безопасный подход может заключаться в том, чтобы вместо этого рабочий поток рисовался в объект QImage, а затем, когда поток графического интерфейса хочет обновить графический интерфейс, он может захватить и нарисовать последнюю версию объекта QImage (используя мьютексы или какой-либо другой механизм, чтобы сделать убедитесь, что рабочий поток не обновляет одновременно QImage).

2

Другие решения

Я согласен в соответствии с документацией, не разрешается использовать QPixmap в рабочем потоке. Однако по коду.

Конструктор проверяет, находится ли он в главном потоке. Если его нет в основном потоке, он проверяет функцию под названием ThreadedPixmap. Если включено, оно будет продолжаться без проблем. Насколько я понимаю, ThreadedPixmap поддерживается на всех платформах, поэтому представляется возможным использовать QPixmaps в других потоках.

0

По вопросам рекламы [email protected]