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