Безопасно ли рисовать три отдельных QImage в трех отдельных QThreads? - PullRequest
1 голос
/ 27 мая 2010

У меня есть QMainWindow с тремя виджетами внутри, которые повышаются до класса, содержащего подкласс QThread. Каждый из них опирается на локальный QImage в своей обратной последовательности qthread, которая отправляется с сигналом после его отрисовки, а затем визуализируется путем вызова update (пример mandlebrot) из слота. Это безопасно или опасно? Они не передают никакие данные, по крайней мере, те, которые я генерирую, и мне интересно, какие данные они могут обмениваться, что находится за пределами моего диапазона кодирования, т.е. которые генерируются Qt автоматически.

1 Ответ

3 голосов
/ 27 мая 2010

С документация :

QPainter можно использовать для рисования на устройствах рисования QImage, QPrinter и QPicture. Рисование на QPixmaps и QWidgets не поддерживается. В Mac OS X диалоговое окно автоматического выполнения не будет отображаться, если вы печатаете вне потока GUI.

Любое количество нитей может рисовать в любой момент времени, однако только одна нить может рисовать на данном устройстве рисования. Другими словами, два потока могут рисовать одновременно, если каждый рисует на отдельных изображениях QImage, но эти два потока не могут одновременно рисовать на одном и том же изображении QImage.

Обратите внимание, что в системах X11 без поддержки FontConfig Qt не может отображать текст вне потока GUI. Вы можете использовать функцию QFontDatabase :: supportsThreadedFontRendering (), чтобы определить, можно ли использовать отрисовку шрифта вне потока GUI.

Так что, пока вы осторожны с проблемой шрифтов в X11, не используйте Pixmaps или Cursors (которые реализованы как Pixmaps), и не пытайтесь рисовать на одно и то же изображение одновременно с несколько потоков ... это должно работать.

Обратите внимание, что в примере с Мандельбротом QImage передается по значению через сигнал (неявно разделяемый), что означает, что если какой-либо поток попытается выполнить запись, он получит свою собственную копию.

...