2017-08-04 5 views
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; 
} 
+0

Haeあなたのプログラムで使用されているメモリ量を調べようとしましたか? 32ビットWindowsシステムでは、各プロセスに2GBの制限があります。また、失敗したmallocが確実でしょうか?はいの場合、あなたはどのようにして見つけましたか?エラーメッセージがありますか? – litelite

+0

"QImage:out of memory、null image"という出力が表示されます。 QImageの実装を調べると、私は根本原因がmallocの失敗に起因することを発見しました。メモリ使用量は約600 MB(プライベートワーキングセット)です。 –

+0

お使いのコンピュータには十分なメモリがありますか?そして、あなたはどのように使用された記憶を測定しましたか? – litelite

答えて

0

この問題は、ヒープメモリの断片化が原因で発生しました。

したがって、解決策として、たとえばメモリアロケータをtcmallocまたはjemallocに置き換えることが考えられます。

私のアプリケーションでは、x86版で同時に開いている画像ファイルの数を制限することで、この問題を十分に回避できることが確認されました。

関連する問題