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 失败的主要内容,如果未能解决你的问题,请参考以下文章