我目前的问题本质上是我似乎无法写入我想要磁盘的所有数据。
我要做的是以二进制格式将浮点值一个接一个地保存到磁盘。在 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();
}