Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在三个单独的QThread中绘制三个单独的QImage安全吗?_Multithreading_Qt_Thread Safety_Widget_Qthread - Fatal编程技术网

Multithreading 在三个单独的QThread中绘制三个单独的QImage安全吗?

Multithreading 在三个单独的QThread中绘制三个单独的QImage安全吗?,multithreading,qt,thread-safety,widget,qthread,Multithreading,Qt,Thread Safety,Widget,Qthread,我有一个QMainWindow,里面有三个小部件,它们被提升为包含子类QThread的类。他们每个人都在他们期望的qthread中绘制一个本地QImage,该qthread在绘制后发送一个信号,然后通过从插槽调用update(mandlebrot示例)进行渲染。这是安全的还是危险的?他们不共享任何数据,至少不共享我正在生成的任何数据,我想知道他们共享的哪些数据超出了我的编码范围,即Qt自动生成的数据。来自: QPainter可用于在QImage、QPrinter和QPicture绘制设备上绘制。

我有一个QMainWindow,里面有三个小部件,它们被提升为包含子类QThread的类。他们每个人都在他们期望的qthread中绘制一个本地QImage,该qthread在绘制后发送一个信号,然后通过从插槽调用update(mandlebrot示例)进行渲染。这是安全的还是危险的?他们不共享任何数据,至少不共享我正在生成的任何数据,我想知道他们共享的哪些数据超出了我的编码范围,即Qt自动生成的数据。

来自:

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

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

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

因此,只要您小心X11上的字体问题,就不要使用任何Pixmaps或游标(实现为Pixmaps),也不要尝试从多个线程同时在同一图像上绘制。。。它应该会起作用


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

gtk并不真正属于这个问题。好的,这些是我遵循的准则,但是您是否注意到GDB在这方面的任何问题?在qthread中使用qlist安全吗?调试多线程代码总是比单线程代码更棘手,但您正在绘制的事实不会改变这一点。QList等Qt数据结构是可重入的,但不是线程安全的……如果有可能多个线程同时使用同一QList,则必须使用QReadWriteLock或QMutex锁定它们。请参阅:我在下面的代码中看到了seg错误:该类没有让线程之外的任何东西访问它的任何数据成员,我只有在设置断点时才得到seg错误。我想这是gdb的错,但那是很少见的。我从来没有在运行时遇到seg错误。如果我复制类的源代码三次,并对每个对象实例使用它,我就不会有这个seg错误。当我一步一步地编写代码时,它并没有完成并重新开始(但在另一个线程中),因此我认为gdb对所有这些都感到困惑。这是在运行函数中,如果代码看起来很低,也就是说,如果我没有放置像QLIST之类的对象,它似乎不会发生。我所做的只是以mandlebrot为例,将QMainWindow中的3小部件升级为mandlebrot,删除在run()中绘制QImage的代码,并用一个简单的函数调用替换它,它发生在该函数调用中。如果你能看一下,如果我不理解,那就太好了。好吧,我不打算编译和调试你的代码!:)但是,如果调试器在查找冒烟的枪时没有帮助,那么您可以尝试以下方法:如果您的something()函数只是一个计数大的while()循环,那么您是否仍然会遇到问题。如果不是,则继续添加位,直到找出是哪个代码段导致它。