QThreadPool 上的 QImage 失败

Posted

技术标签:

【中文标题】QThreadPool 上的 QImage 失败【英文标题】:QImage on QThreadPool fails 【发布时间】:2016-01-09 21:18:10 【问题描述】:

我正在尝试使用线程池从文件中加载多个 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 上运行可运行程序,我就会收到一大堆错误,基本上都是一样的:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

问题自己解决了:

我传递给QImage 的路径无效。我不知道这怎么会产生这样的错误,但是在我修复了路径之后,它就可以正常工作了!

【讨论】:

以上是关于QThreadPool 上的 QImage 失败的主要内容,如果未能解决你的问题,请参考以下文章

QImage/QPixmap加载图片失败(宽和高都为0)的两种解决方法

从 QBytearray 创建 QImage

如何覆盖 PyQt5 QThreadPool?

Jpeg 在发布版本中使用 QImage 读取错误

在 QThreadPool 中执行槽

QImage(uchar *data) 如何格式化数组?