0

我目前的问题本质上是我似乎无法写入我想要磁盘的所有数据。

我要做的是以二进制格式将浮点值一个接一个地保存到磁盘。在 1.000.000 和 400.000.000 个浮点值之间可以有任何偶数个值。在内部,数据存储在 QSharedPointer 中。我在不同的函数、不同的线程中使用相同的数据。我确保访问不会更改字段中的值。

我所拥有的类似于:

class blubb : public QObject
{
    Q_OBJECT
 public slots:
    void foo(QSharedPointer<float> data, size_t size)
    {
        QFile saveFile("ExampleFileName");
        QDataStream streamer;

        saveFile.open(QIODevice::WriteOnly);

        streamer.setDevice(&saveFile);
        streamer.setFloatingPointPrecision(QDataStream::SinglePrecision);
        streamer.setByteOrder(QDataStream::BigEndian);

        qDebug() << "Now writing: " << size << " elements." << endl;
        qDebug() << "With: " << sizeof (*data.data()) << " byte per entry." << endl;
        qDebug() << "Total space: " << size * sizeof(*data.data()) << " bytes.";        


        for (size_t i = 0; i < size; i++)
        {
            streamer << (data.data())[i];
        }

        qInfo() << "Writing done of " << size << " float values of "
                << sizeof (*data.data()) << " bytes per entry, total written space: "
                << size * sizeof(*data.data());
    }
};

例如,如果我在数据中有 4.000.000 浮点值,我会按预期得到所有内容:要写入 4.000.000 个元素,每个元素 4 个字节,总共要写入 16.000.000 个字节。但我发现写入的实际数量是:15.990.784 字节。

如果我尝试在数据中总共使用 2.000.000 个元素,则写入的字节数为:7.995.392 而不是 8.000.000。这是一致且可重复的。丢失的字节数量与我在数据中的条目数量成正比。

有趣的事实:我在另一个线程中有另一个函数,它使用相同的 QSharedPointer 来执行此操作:

class blubber2 : public QObject
{
    Q_OBJECT
public slots:
    void fooOtherThread(QSharedPointer<float> data, size_t size)
    {
        if ((size % 2) != 0)
        {
            std::invalid_argument ex("Data is not evenly sized.");
            throw ex;
        }

        QVector<float> vec1;
        QVector<float> vec2;

        bool toggle = false;

        std::partition_copy(data.data(),
                            data.data()+size,
                            std::back_inserter(vec1),
                            std::back_inserter(vec2),
                            [&toggle](int)
        {
            return toggle = !toggle;
        });

    }
};

如果我在数据中有 4.000.000 个条目,则 vec1 和 vec2 中的元素数量为 2.000.000。

那么我在第一个函数中做错了什么?为什么写入文件的字节数错误?

编辑:// 这应该开始整个事情:

class Starter : public QObject
{
signals: 
    void startSignal(QSharedPointer<float> data, size_t size);

public slots:
    void helperStart()
    {
        size_t size = 2000000;
        QSharedPointer<float> data(new float[size]);
        emit startSignal(data, size);
    }

};
int main (int argc, char ** argv)
{
    QCoreApplication app(argc, argv);
    qRegisterMetaType<QSharedPointer<float>>("QSharedPointer<float>");
    qRegisterMetaType<size_t>("size_t");

    blubb blubbInstance;
    blubber2 blubberInstance;

    QThread blubbThread;
    QThread blubberThread;

    blubbInstance.moveToThread(&blubbThread);
    blubberInstance.moveToThread(&blubberThread);

    blubbThread.start();
    blubberThread.start();


    Starter starterInstance;
    QTimer timer;
    timer.setSingleShot(500);
    QObject::connect(&timer, &QTimer::timeout, &starterInstance, &Starter::helperStart);

    QObject::connect(&starterInstance, &Starter::startSignal, &blubbInstance, &blubb::foo);
    QObject::connect(&starterInstance, &Starter::startSignal, &blubberInstance, &blubber2::fooOtherThread);

    timer.start();
    app.exec();        
}
4

0 回答 0