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

时间:2017-08-04 13:42:06

标签: qt malloc heap qthread qtconcurrent

在x86上,它可能无法在工作线程上初始化QImage。 (在x64中很少见)

当对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;
}

1 个答案:

答案 0 :(得分:0)

本质上,这个问题是由堆内存碎片引起的。

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

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