Проблемы разработки QFutureWatcher для улучшения времени загрузки изображений
Я пытаюсь загрузить несколько изображений, используя многопоточность через класс QFutureWatcher, но я не могу сделать это правильно. Мой код читает URL изображений и сохраняет их в QVector. Затем я передаю эти QStrings в функцию, которая загружает, изменяет размер и сохраняет изображения в объекте QMap. Код является:
void MainWindow::loadImages(){
mImagesLoaderfutureWatcher = new QFutureWatcher<QString>() ;
connect(mImagesLoaderfutureWatcher, SIGNAL(finished()),this, SLOT(imageLoadingfinished()));
QVector<QString> imagesList = mProject->getImagesFileName();
// Start the computation.
mImagesLoaderfutureWatcher->setFuture(QtConcurrent::map(imagesList,addImageThumnailToMap));
}
void MainWindow::addImageThumnailToMap(QString imageName){
QSize desiredSize(100,100);
QImage orig(mProject->getBasePath()+"/"+imageName);
QImage scaled = orig.scaled(
desiredSize,
Qt::KeepAspectRatio,
Qt::SmoothTransformation);
mMapImages->insert(imageName,scaled);
}
void MainWindow::imageLoadingfinished(){
QMessageBox msg;
msg.setText("Images loaded");
msg.show();
}
Ошибка, которую я получаю, когда пытаюсь скомпилировать, говорит о том, что список аргументов в вызове функции "addImageThumnailToMap" не найден, но я думаю, что нет необходимости указывать это в функции "QtConcurrent::map()", Спасибо за вашу помощь
1 ответ
Это потому, что функция является членом класса. Вы должны назвать это так:
mImagesLoaderfutureWatcher->setFuture(
QtConcurrent::map(imagesList,&MainWindow::addImageThumnailToMap));
Он также выглядит так, как будто QtConcurrent::map принимает только глобальные или статические функции, потому что нет указателя на экземпляр для вызова addImageThumnailToMap
, Так заявить MainWindow::addImageThumnailToMap
как статичный.
Я лично предпочитаю использовать QtConcurrent::run
, который может обрабатывать функции-члены класса. Например:
void ImageGroupView::setImages( QStringList il )
{
//QFuture<int> _imageLoader;
//QFutureWatcher<int> _watcher;
_imageLoader = QtConcurrent::run(this, &ImageGroupView::loadImages, il );
connect(&_watcher, SIGNAL(finished()), this, SLOT(processImagesReady()));
_watcher.setFuture( _imageLoader );
}
Параметры шаблона просто оказались int, потому что функция loadImages возвращает количество фактически загруженных изображений.
int ImageGroupView::loadImages( QStringList il )
{
int numLoaded=0;
_images.clear();
foreach ( QString img, il )
{
if( QFileInfo( img ).exists() )
{
_imageList.append( QImage( img ).scaled(640,480) );
numLoaded++;
}
}
return numLoaded;
}