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 в других потоках.

Другие вопросы по тегам