内存映射写磁盘
This commit is contained in:
@ -938,7 +938,28 @@ WriteData2Disk::WriteData2Disk()
|
|||||||
void WriteData2Disk::write2Disk()
|
void WriteData2Disk::write2Disk()
|
||||||
{
|
{
|
||||||
QString imageFileName=m_QbaseFileName+".bil";
|
QString imageFileName=m_QbaseFileName+".bil";
|
||||||
FILE *hFile=fopen(imageFileName.toStdString().c_str(),"w+b");
|
// FILE *hFile=fopen(imageFileName.toStdString().c_str(),"w+b");
|
||||||
|
|
||||||
|
|
||||||
|
int fd = open(imageFileName.toStdString().c_str(), O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
|
||||||
|
|
||||||
|
size_t fileSize = m_iFrameSizeInByte*(size_t)100*(size_t)60*(size_t)5;
|
||||||
|
size_t fileSizeIncrement = m_iFrameSizeInByte*(size_t)100*(size_t)60*(size_t)5;
|
||||||
|
if (lseek(fd, fileSize - 1, SEEK_SET) == -1) {
|
||||||
|
std::cerr << "Error calling lseek()\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (write(fd, "", 1) == -1) {
|
||||||
|
std::cerr << "Error writing last byte of the file\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void* addr = mmap(nullptr, fileSize, PROT_WRITE, MAP_SHARED, fd, 0);
|
||||||
|
if (addr == MAP_FAILED) {
|
||||||
|
std::cerr << "Error mmapping the file\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t sizeWrited2disk = 0;
|
||||||
|
|
||||||
int frameCounter = 0;
|
int frameCounter = 0;
|
||||||
int frameNumber;
|
int frameNumber;
|
||||||
@ -975,13 +996,71 @@ void WriteData2Disk::write2Disk()
|
|||||||
|
|
||||||
|
|
||||||
// std::cout<<"WriteData2Disk::write2Disk-----------------------正在写磁盘!" << m_pool->max_size() <<std::endl;//
|
// std::cout<<"WriteData2Disk::write2Disk-----------------------正在写磁盘!" << m_pool->max_size() <<std::endl;//
|
||||||
fwrite(dataBuffer,1,m_iFrameSizeInByte*frameNumber, hFile);
|
|
||||||
|
|
||||||
|
if (fileSize < sizeWrited2disk + m_iFrameSizeInByte*frameNumber)
|
||||||
|
{
|
||||||
|
// if (munmap(addr, fileSize) == -1) {
|
||||||
|
// std::cerr << "Error un-mmapping the file\n";
|
||||||
|
// }
|
||||||
|
|
||||||
|
// std::cout<<"老fileSize:" << fileSize <<std::endl;
|
||||||
|
size_t new_size = fileSize + fileSizeIncrement;
|
||||||
|
if (ftruncate(fd, new_size) == -1) {
|
||||||
|
std::cerr << "Error calling ftruncate()\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remap the file with the new size
|
||||||
|
addr = mremap(addr, fileSize, new_size, MREMAP_MAYMOVE);
|
||||||
|
if (addr == MAP_FAILED) {
|
||||||
|
std::cerr << "Error calling mremap()\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fileSize = new_size;
|
||||||
|
// std::cout<<"新fileSize:" << fileSize <<std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
// fwrite(dataBuffer,1,m_iFrameSizeInByte*frameNumber, hFile);
|
||||||
|
memcpy(addr + sizeWrited2disk, dataBuffer, m_iFrameSizeInByte*frameNumber);
|
||||||
|
|
||||||
|
sizeWrited2disk = sizeWrited2disk + m_iFrameSizeInByte*frameNumber;
|
||||||
|
// std::cout<<"sizeWrited2disk:" << sizeWrited2disk <<std::endl;
|
||||||
|
|
||||||
frameCounter++;
|
frameCounter++;
|
||||||
}
|
}
|
||||||
m_rgbImage->m_VideoWriter.release();
|
m_rgbImage->m_VideoWriter.release();
|
||||||
fclose(hFile);
|
// fclose(hFile);
|
||||||
delete[] dataBuffer;
|
delete[] dataBuffer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// if (munmap(addr, fileSize) == -1) {
|
||||||
|
// std::cerr << "Error un-mmapping the file\n";
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Resize the file to 4096 bytes
|
||||||
|
if (ftruncate(fd, sizeWrited2disk) == -1) {
|
||||||
|
std::cerr << "Error calling ftruncate()\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remap the file with the new size
|
||||||
|
addr = mremap(addr, fileSize, sizeWrited2disk, MREMAP_MAYMOVE);
|
||||||
|
if (addr == MAP_FAILED) {
|
||||||
|
std::cerr << "Error calling mremap()\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (munmap(addr, sizeWrited2disk) == -1) {
|
||||||
|
std::cerr << "Error un-mmapping the file\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
|
||||||
std::cout<<"WriteData2Disk::write2Disk-----------------------写磁盘线程将退出,内存池可达到的最多元素数:" << m_pool->max_size() <<std::endl;
|
std::cout<<"WriteData2Disk::write2Disk-----------------------写磁盘线程将退出,内存池可达到的最多元素数:" << m_pool->max_size() <<std::endl;
|
||||||
std::cout<<"WriteData2Disk::write2Disk-----------------------写磁盘线程将退出,fwrite 调用次数:" << frameCounter <<std::endl;
|
std::cout<<"WriteData2Disk::write2Disk-----------------------写磁盘线程将退出,fwrite 调用次数:" << frameCounter <<std::endl;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user