QThreadPool上的QImage失败

时间:2016-01-09 21:18:11

标签: c++ qt qthread qimage

我正在尝试使用线程池从文件加载多个QImage对象。我创建了自己的QRunnable子类来从文件加载图像并将其复制到缓冲区中:

class ImageLoader : public QRunnable
{
public:
    ImageLoader(const QString &filename, char **buffer, int *size) : 
        QRunnable(),
        filename(filename),
        buffer(buffer),
        size(size)
    {}

    // QRunnable interface
    void run() {
        QImage image(filename);
        (*size) = image.byteCount();
        (*buffer) = new char[(*size)];
        memcpy_s(*buffer), (*size), image.constBits(), image.byteCount());
    }

private:
    const QString filename;
    char **buffer;
    int *size;
};

如果在主线程上执行代码,代码工作正常,但是只要我在QThreadPool上运行runnable,我就会收到大量错误,基本上所有都是这样说的:

QObject::moveToThread: Current thread (0x2a023ae6550) is not the object's thread (0x2a023ae65c0).
Cannot move to target thread (0x2a023aca0f0)

前两个地址会更改每条消息,我认为它们代表了池的不同线程。有趣的是:
第一个和第二个从不相同,但是,它们都是相同的“组”,即第一个错误的第一个地址可以成为第二个错误的第二个地址等......

第三个地址始终保持不变,它是主(gui)线程的地址。

任何想法为什么会发生这种情况或如何解决?我阅读了QImage的文档但是没有找到任何有关线程的信息,除了:

  

因为QImage是QPaintDevice子类,所以可以使用QPainter直接绘制到图像上。在QImage上使用QPainter时,可以在当前GUI线程之外的另一个线程中执行绘制。

1 个答案:

答案 0 :(得分:0)

自己解决了这个问题:

我传递给QImage的路径无效。我不知道这是如何产生这样的错误的,但是在修好路径后,它运行得很好!