QImageReaderを使用して一度に画像ファイルの一部を読み込もうとしています。非常に大きな画像の場合、必要なまでディスクからメモリに読み込まれません表示されます。QtConcurrentを使用してQImageReaderで画像ファイルを読み取る
私はいくつかのスレッドの安全性の問題に遭遇しています。
#include "rastertile.h"
QMutex RasterTile::mutex;
RasterTile::RasterTile()
{
}
//RasterTile::RasterTile(QImageReader *reader, int nBlocksX, int nBlocksY, int xoffset, int yoffset, int nXBlockSize, int nYBlockSize)
RasterTile::RasterTile(QString filename, int nBlocksX, int nBlocksY, int xoffset, int yoffset, int nXBlockSize, int nYBlockSize)
: Tile(nBlocksX, nBlocksY, xoffset, yoffset, nXBlockSize, nYBlockSize)
{
this->reader = new QImageReader(filename);
connect(&watcher,SIGNAL(finished()),this,SLOT(updateSceneSlot()));
}
void RasterTile::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
{
if(image.isNull())
{
TilePainter=painter;
TileOption=option;
TileWidget=widget;
future = QtConcurrent::run(this, &RasterTile::LoadTilePixmap);
watcher.setFuture(future);
}else
{
QRectF imageRect = image.rect();
painter->drawImage(imageRect, image);
}
}
QImage RasterTile::LoadTilePixmap()
{
QMutexLocker locker(&mutex);
QImage img(nBlockXSize, nBlockYSize, QImage::Format_RGB32);
QRect rect(tilePosX*nBlockXSize, tilePosY*nBlockYSize, nBlockXSize, nBlockYSize);
reader->setClipRect(rect);
reader->read(&img);
if(reader->error())
{
qDebug("Not null error");
qDebug()<<"Error string is: "<<reader->errorString();
}
return img;
}
だから、これは基本的に各タイルの新しいリーダーをインスタンス化し、私はその後、ペイントすることができ、スーパークラスの「画像」変数を、更新された:
これは私が現在持っているものです。
これは私がこれはおそらく、同じファイルにアクセスして、多くのタイルとは何かだと思うが、私はいけない
単に「画像データを読み取ることができません」と言った、私の読者からのエラーの多くを与えるように思われますそれを証明する方法を知っているか、それを修正してください。
私はQtがlibjpegとlibpngを使用していて、他にもさまざまなイメージフォーマットを読み込むと思います。
「多くのタイル」はいくつですか?実際のスレッド数の制限は、通常はかなり小さいです。 – Jay
単純なシングルスレッドプログラムがQImageReaderを介してタイルをロードできることを確認してください。また、LoadTilePixmap()でスタック上にQImageReaderを作成します。 LoadPixmapを自由な関数にして、すべてを引数として渡すと、同期の問題を避けることができます。なぜミューテックス?静的ですか?それは一度にロードされるタイルを1に制限します... –
タイルの数は1000を超えることがありますが、一度に読み込む数はわずかです。ビューアで最初に表示されるタイルは、新しいスレッドを開始する唯一のものです。ミューテックスは静的でした。 QImageReaderに複数のファイルを一度にディスクにアクセスさせないようにしていました。 QImageReaderをスタックに配置しようとしましたが、ヒープ上にあると同じ結果が得られ、渡されました。 – Derek