From 6473a1f4cece35ae127dc2b0700e5a562b3037c5 Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Tue, 4 Jul 2023 21:22:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E5=AD=98=E6=98=A0=E5=B0=84=E5=86=99?= =?UTF-8?q?=E7=A3=81=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source_Files/ximeaimager.cpp | 85 ++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 3 deletions(-) diff --git a/Source_Files/ximeaimager.cpp b/Source_Files/ximeaimager.cpp index 821a7e4..662c65c 100644 --- a/Source_Files/ximeaimager.cpp +++ b/Source_Files/ximeaimager.cpp @@ -938,7 +938,28 @@ WriteData2Disk::WriteData2Disk() void WriteData2Disk::write2Disk() { 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 frameNumber; @@ -975,13 +996,71 @@ void WriteData2Disk::write2Disk() // std::cout<<"WriteData2Disk::write2Disk-----------------------正在写磁盘!" << m_pool->max_size() <m_VideoWriter.release(); - fclose(hFile); +// fclose(hFile); 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() <