Pixmap разделяется между потоками в Qt
У меня есть основной класс GUI и другой класс Worker: первый справляется с вещами GUI (рисует QPixmap
в QGraphicsScene
), вторая с вычислениями вещь (рисунок QLine
с и QPoint
на это QPixmap
).
The two classes run in two different threads. Когда я создаю Worker
thread, I pass the address of the GUI's QPixmap
к Worker
class, so they share the same object.
QPixmap
is modified in the Worker
class, and drawn in the GUI
учебный класс. Even if I didn't have any problem, I decided to use a QMutex
to ensure my program wouldn't try to access the QPixmap
while it was being drawn. Now, in order to do this, I have a QMutex
shared between GUI class and Worker
учебный класс (Worker
class has again a pointer to the GUI's QMutex
). Whenever I read or modify the QPixmap
I lock the QMutex
,
Это правильный подход? I never got errors so far, but I wonder if it is logically correct and whether Qt provides a better way to accomplish this.
Заранее спасибо.
2 ответа
Согласно странице безопасности потоков Qt5:
QPainter может использоваться в потоке для рисования на устройствах рисования QImage, QPrinter и QPicture. Рисование на QPixmaps и QWidgets не поддерживается.
Так что официальная строка - нет, вы не должны изменять QPixmap вне основного потока. Возможно, вам "повезло" в том, что это работает на вашей текущей платформе при вашем текущем сценарии использования, но Qt не гарантирует, что это будет работать.
Более безопасный подход может заключаться в том, чтобы ваш рабочий поток вместо этого рисовался в объект QImage, а затем, когда поток GUI хочет обновить графический интерфейс, он может захватить и нарисовать последнюю версию объекта QImage (используя мьютексы или какой-то другой механизм, чтобы сделать убедитесь, что рабочий поток не обновляет одновременно QImage).
Я согласен в соответствии с документацией, не разрешается использовать QPixmap в рабочем потоке. Однако по коду.
Конструктор проверяет, находится ли он в главном потоке. Если его нет в основном потоке, он проверяет функцию под названием ThreadedPixmap. Если включено, оно будет продолжаться без проблем. Насколько я понимаю, ThreadedPixmap поддерживается на всех платформах, поэтому представляется возможным использовать QPixmaps в других потоках.