我正在尝试使用线程池从文件加载多个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线程之外的另一个线程中执行绘制。
答案 0 :(得分:0)
自己解决了这个问题:
我传递给QImage
的路径无效。我不知道这是如何产生这样的错误的,但是在修好路径后,它运行得很好!