У меня есть основной класс GUI и другой класс Worker: первый справляется с вещами GUI (рисует QPixmap
в QGraphicsScene
), вторая с вычислениями вещь (рисунок QLine
с и QPoint
на это QPixmap
).
Два класса работают в двух разных потоках.
Когда я создаю Worker
нить, я передаю адрес графического интерфейса QPixmap
к Worker
класс, поэтому они разделяют один и тот же объект.
QPixmap
модифицируется в Worker
класс, и обращается в GUI
учебный класс. Даже если у меня не было никаких проблем, я решил использовать QMutex
чтобы моя программа не пыталась получить доступ к QPixmap
пока он рисовался. Теперь, чтобы сделать это, у меня есть QMutex
разделены между классом GUI и Worker
учебный класс (Worker
класс снова имеет указатель на графический интерфейс QMutex
). Всякий раз, когда я читаю или изменяю QPixmap
Я блокирую QMutex
,
Это правильный подход? До сих пор я не получал ошибок, но мне интересно, является ли это логически правильным и предоставляет ли Qt лучший способ сделать это.
Заранее спасибо.
Согласно Qt5 потокобезопасная страница:
QPainter может использоваться в потоке для рисования на QImage, QPrinter и
QPicture окраска устройства. Рисование на QPixmaps и QWidgets не
поддерживается.
Так что официальная строка — нет, вы не должны изменять QPixmap вне основного потока. Возможно, вам «повезло» в том, что это работает на вашей текущей платформе при вашем текущем сценарии использования, но Qt не гарантирует, что это будет работать.
Более безопасный подход может заключаться в том, чтобы вместо этого рабочий поток рисовался в объект QImage, а затем, когда поток графического интерфейса хочет обновить графический интерфейс, он может захватить и нарисовать последнюю версию объекта QImage (используя мьютексы или какой-либо другой механизм, чтобы сделать убедитесь, что рабочий поток не обновляет одновременно QImage).
Я согласен в соответствии с документацией, не разрешается использовать QPixmap в рабочем потоке. Однако по коду.
Конструктор проверяет, находится ли он в главном потоке. Если его нет в основном потоке, он проверяет функцию под названием ThreadedPixmap. Если включено, оно будет продолжаться без проблем. Насколько я понимаю, ThreadedPixmap поддерживается на всех платформах, поэтому представляется возможным использовать QPixmaps в других потоках.