【问题标题】:QBuffer in a QRunnable may or may not generates error QObject::moveToThread: Current thread is not the object's threadQRunnable 中的 QBuffer 可能会也可能不会生成错误 QObject::moveToThread: Current thread is not the object's thread
【发布时间】: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,但一切正常。

标签: qt qt5.3


【解决方案1】:

我终于找到了问题,我正在回答我自己的问题,以防它可以帮助其他人。

因此,问题与我使用的是 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 中不会出现错误消息,也不会出现问题。

希望这对其他人有帮助。干杯!!

【讨论】:

  • 这也解决了我在 Qt5.5.1 中调用 QCameraImageCapture::capture() 时遇到的问题。
猜你喜欢
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 2020-10-07
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多