0
x86では、ワーカースレッドでQImageを初期化できないことがあります。 (希少x64)QtConcurrent :: run()でmalloc()が失敗する
CPUのコア数に対して並列処理を行うと、確率が高くなります。
これは画像ファイルから読み込むだけでなく、プレーンQImageをサイズを指定して初期化するか、単にQImage :: copy()を呼び出すことによっても発生します。
これはこれを避けるためのコードです。もちろん完璧ではありません。 もっと良い方法を教えてください。
QImage createImageAsync(QString path)
{
QImageReader reader(path);
if(!reader.canRead())
return QImage();
// QImage processing sometimes fails
QImage src;
int count = 0;
do {
src = reader.read();
if(!src.isNull())
break;
if(src.isNull() && count++ < 1000) {
QThread::currentThread()->usleep(1000);
continue;
}
return QImage();
} while(1);
return src;
}
Haeあなたのプログラムで使用されているメモリ量を調べようとしましたか? 32ビットWindowsシステムでは、各プロセスに2GBの制限があります。また、失敗したmallocが確実でしょうか?はいの場合、あなたはどのようにして見つけましたか?エラーメッセージがありますか? – litelite
"QImage:out of memory、null image"という出力が表示されます。 QImageの実装を調べると、私は根本原因がmallocの失敗に起因することを発見しました。メモリ使用量は約600 MB(プライベートワーキングセット)です。 –
お使いのコンピュータには十分なメモリがありますか?そして、あなたはどのように使用された記憶を測定しましたか? – litelite