malloc()在QtConcurrent :: run()中失败

问题描述:

在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

基本上这个问题是由堆内存碎片造成的。

因此,作为解决方案,例如,可以想象用tcmalloc或jemalloc替换内存分配器。

在我的应用程序中,确认可以通过限制在x86版本中同时打开的图像文件的数量来充分避免此问题。