【发布时间】:2014-10-23 19:57:52
【问题描述】:
我有一个 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,这个是在执行线程中本地创建的。我不明白我为什么会得到这个。
任何帮助将不胜感激!
如果可以提供任何线索,我会在 Windows 7 和 MSVC2010 32 位下使用 QT 5.3 运行它。
以下链接指向重现问题的示例应用程序。 ParallelImageProc.zip 它包含一个屏幕截图,显示了我得到的实际结果。
谢谢!
【问题讨论】:
-
您确定所描述的代码确实会产生该警告吗?
-
当然。一旦我注释掉使用 QBuffer 对象的 rotateImage.save(...) ,就不会再出现问题了。如果我这样做: Object * o = new QObject(); QBuffer buffer(_resultImage, o) 我总是收到错误,这次不是偶尔出现。
-
我检查了 QBuffer 源代码,它没有任何 moveToThread 调用。我认为您应该提供一个重现您的问题的最小示例。
-
我添加了一个指向示例测试应用程序的链接,如果您想看看的话。谢谢
-
我在 CentOS 下使用 Qt 4.6.2 构建了您的示例,没有任何问题。我还像您之前的评论一样使用了带有父级的 QBuffer,但一切正常。