在三个独立的QThreads中绘制三个单独的QImages是否安全?

时间:2010-05-26 22:11:23

标签: multithreading qt thread-safety widget qthread

我有一个QMainWindow,里面有三个小部件,它们被提升为一个包含子类QThread的类。它们各自在它们的rexpective qthread中绘制一个本地QImage,一旦绘制它就会发送信号,然后通过从插槽调用update(mandlebrot示例)来呈现。这样安全还是危险?他们不共享任何数据,至少没有我生成的数据,并且想知道他们可以共享哪些数据超出了我的编码范围,即由Qt自动生成。

1 个答案:

答案 0 :(得分:3)

来自the documentation

QPainter可用于绘制到QImage,QPrinter和QPicture绘图设备上。不支持在QPixmaps和QWidgets上绘画。在Mac OS X上,如果从GUI线程外部打印,则不会显示自动进度对话框。

任何给定时间都可以绘制任意数量的线程,但是一次只有一个线程可以在给定的绘制设备上绘制。换句话说,如果每个绘制到单独的QImages上,两个线程可以同时绘制,但是两个线程不能同时绘制到同一个QImage上。

请注意,在没有FontConfig支持的X11系统上,Qt无法在GUI线程之外呈现文本。您可以使用QFontDatabase :: supportsThreadedFontRendering()函数来检测是否可以在GUI线程之外使用字体呈现。

因此,只要您对X11上的字体问题非常小心,不要使用任何Pixmaps或Cursors(实现为Pixmaps),也不要尝试同时绘制到同一图像上。多线程......它应该可以工作。

请注意,在Mandelbrot示例中,QImage通过信号(隐式共享)传递值,这意味着如果任一线程尝试写入,它将获得自己的副本。