У меня есть производный класс из объекта QRunnable. Он выполняет небольшие задачи обработки изображений. Он выглядит следующим образом:QBuffer в QRunnable может или не может генерировать ошибку QObject :: moveToThread: текущий поток не является потоком объекта
void ImageProcessor::run()
{
int bytesPerLine;
if(_format == QImage::Format_RGB32)
bytesPerLine = _width * 4;
QImage img(_buffer, _width, _height, bytesPerLine, _format);
QTransform transform;
transform.rotate(90);
QImage rotatedImage = img.transformed(transform);
_resultImage->clear();
QBuffer buffer(_resultImage);
buffer.open(QIODevice::WriteOnly);
rotatedImage.save(&buffer, "JPG", 85);
buffer.close();
}
Моя проблема в том, что когда я выполняю свое приложение, отображается следующее сообщение об ошибке, но не всегда. Я могу запустить его в другое время и не вижу ничего особенного.
QObject::moveToThread: Current thread (0x2012268) is not the object's thread (0x2007dc0). Cannot move to target thread (0x21a6218)
Единственным производным классом QObject, который я использую, является QBuffer, и он создается локально в исполняемом потоке. Я не понимаю, почему я получаю это.
Любая помощь будет оценена!
Я запускаю это с QT 5.3, под Windows 7 и MSVC2010 32 бит, если он может дать какие-либо подсказки.
Следующая ссылка на пример приложения, который воссоздает проблему. ParallelImageProc.zip Он содержит скриншот, который показывает фактический результат, который я получаю.
Спасибо!
Вы уверены, что описанный код действительно выдаст это предупреждение? – hank
Абсолютно. Как только я прокомментирую rotatedImage.save (...), которые используют объект QBuffer, проблем больше не возникает. Также, если я это сделаю: Object * o = new QObject(); Буфер QBuffer (_resultImage, o) На этот раз я всегда получаю ошибку, а не спорадически. –
Я проверил исходный код QBuffer, и у него нет никаких вызовов moveToThread. Я думаю, вы должны предоставить минимальный пример, который воспроизводит вашу проблему. – hank