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

问题描述:

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

+0

gtk并不真的属于这个问题。 – 2010-05-26 22:44:52

the documentation

QPainter的可用于油漆到QImage的,QPrinter来,和QPicture涂料设备。不支持绘制到QPixmaps和QWidgets上。在Mac OS X上,如果您从GUI线程之外进行打印,则不会显示自动进度对话框。

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

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

因此,只要您对X11的字体问题非常小心,请勿使用任何Pixmaps或光标(它们以Pixmaps的形式实现),并且不要尝试在相同的图像上绘制相同的图像来自多个线程的时间...它应该工作。

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

+0

好的,这些都是我遵循的指导原则,你是否对GDB的任何问题感到担忧?在qthread中使用QList是否安全? – 2010-05-26 22:48:47

+1

调试多线程代码总是比单线程更棘手,但您绘制的事实不会改变这一点。像QList这样的Qt数据结构是* reentrant *但不是*线程安全的* ...如果可以让多个线程在相同的QList上获得同样的功能,则必须使用QReadWriteLock或QMutex锁定它们时间。请参阅:http://doc.trolltech.com/4.6/threads-reentrancy.html – HostileFork 2010-05-26 23:04:28

+0

我已经看到在以下代码中发生seg故障:http://www.mediafire.com/?mwjlm3yltej类没有得到任何它的数据成员可以通过线程之外的任何东西访问,并且只有当我放置断点时才会出现seg错误。我想认为这是gdb的错,但那将是一种罕见的行为。我在运行时从未遇到过seg故障。如果我复制类的源代码三次,并将其用于每个对象实例,我不会收到此seg错误。当我一步一步的代码,它并没有遵循,并重新开始(但在一个不同的线程),所以我想gdb是所有这一切困惑。 – 2010-05-27 00:15:35