Я пытаюсь загрузить несколько объектов QImage
из файлов с помощью threadpool. Я создал свой собственный QRunnable
подкласс, чтобы загрузить изображение из файла и скопировать его в буфер:QImage on QThreadPool не работает
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 может использоваться для рисования непосредственно на изображениях. При использовании QPainter на QImage картина может быть выполнена в другом потоке, чем текущий поток графического интерфейса пользователя.