我有一个来自QRunnable对象的派生类。它正在进行小型图像处理任务。看起来如下:
void ImageProcessor::run()
{
int bytesPerLine;
if(_format == QImage::Format_RGB32)
bytesPerLine = _width * 4;
QImage img(_buffer, _width, _height, bytesPerLine, _format);
QTransform transform;
transform.rotate(90);
QImage rotatedImage = img.transformed(transform);
_resultImage->clear();
QBuffer buffer(_resultImage);
buffer.open(QIODevice::WriteOnly);
rotatedImage.save(&buffer, "JPG", 85);
buffer.close();
}
我的问题是当我执行我的应用程序时,会显示以下错误消息,但并非总是如此。我可以在其他时间运行它并且看不出任何特别的东西。
QObject::moveToThread: Current thread (0x2012268) is not the object's thread (0x2007dc0). Cannot move to target thread (0x21a6218)
我使用的唯一QObject派生类是QBuffer,这个是在执行线程中本地创建的。我不明白为什么我会这样做。
任何帮助将不胜感激!
我使用QT 5.3,在Windows 7和MSVC2010 32位下运行它,如果它可以提供任何线索。
以下指向重新创建问题的示例应用程序的链接。 ParallelImageProc.zip它包含一个屏幕截图,显示了我得到的实际结果。
谢谢!
答案 0 :(得分:4)
我终于找到了问题,并且我回答了我自己的问题,以防它可以帮助别人。
所以,问题与我使用QBuffer对象的事实无关。我尝试执行类似以下操作,并且未记录任何错误消息:
QBuffer buffer;
buffer.open(QBuffer::WriteOnly);
char buf[] = new char[100 * 1024 * 1024;
buffer.write(buf, 100 * 1024 * 1024);
delete [] buf;
buffer.close();
这使我感到困惑,因为从QObject派生的唯一类是QBuffer。同时,我确信问题是由电话引起的:
rotatedImage.save(&buffer, "JPG", 85);
经过多次尝试并深入研究了Qt源文件后,我发现自己错了。还有另一个继承QObject的类。使用场景后面的插件管理图像格式。产生我问题的课程是QImageIOPlugin。在Qt源代码中,这些类是从专用于图像格式的QFactoryLoader实例加载的。
following thread,即使是针对其他问题,也帮我直接指出了我显示的错误消息的来源。
由于无法直接访问此工厂加载的实例,解决此问题的最简单方法是在使用任何线程之前将图像伪造成所需格式。在我的例子中,我只是在main(...)函数中添加了以下行:
QImage image(10, 10, QImage::Format_RGB32);
QBuffer buffer;
buffer.open(QBuffer::WriteOnly);
image.save(&buffer, "JPG", 85);
buffer.close();
在这种情况下,QImageIOPlugin将在线程之前创建。将图像保存到QBuffer中时没有错误信息也没有问题。
希望这可以帮助别人。干杯!!