2017-08-04 80 views
0

在x86上,它可能無法在工作線程上初始化QImage。 (在x64中很少)malloc()在QtConcurrent :: run()中失敗

當在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:內存不足,返回空圖像」。檢查QImage的實現,我發現根本原因是由於malloc失敗。內存使用量約爲600 MB(私人工作集)。 –

+0

您的計算機是否有足夠的可用內存?你是如何測量使用過的內存的? – litelite

回答

0

基本上這個問題是由堆內存碎片造成的。

因此,作爲解決方案,例如,可以想象用tcmalloc或jemalloc替換內存分配器。

在我的應用程序中,確認可以通過限制在x86版本中同時打開的圖像文件的數量來充分避免此問題。