@ -938,29 +938,9 @@ 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 ;
unsigned short * dataBuffer = new unsigned short [ m_iFrameSizeInByte / 2 * m_iNumber_WriteDisk ] ;
unsigned short * dataBuffer = new unsigned short [ m_iFrameSizeInByte / 2 * m_iNumber_WriteDisk ] ;
@ -975,12 +955,18 @@ void WriteData2Disk::write2Disk()
std : : cout < < " WriteData2Disk::write2Disk-----------------------队列为空,采集线程已经退出! " < < std : : endl ;
std : : cout < < " WriteData2Disk::write2Disk-----------------------队列为空,采集线程已经退出! " < < std : : endl ;
break ;
break ;
}
}
else if ( isExitWriteData2Disk )
{
std : : cout < < " WriteData2Disk::write2Disk-----------------------isExitWriteData2Disk: true " < < std : : endl ;
std : : cout < < " WriteData2Disk::write2Disk-----------------------队列大小 " < < m_q - > size ( ) < < std : : endl ;
}
else if ( bempty & & ! isExitWriteData2Disk )
else if ( bempty & & ! isExitWriteData2Disk )
{
{
continue ;
continue ;
}
}
r_qtx . lock ( ) ;
r_qtx . lock ( ) ;
DataBuffer * buffer = m_q - > front ( ) ;
DataBuffer * buffer = m_q - > front ( ) ;
int frameNumber = m_qFrameCounter - > front ( ) ;
int frameNumber = m_qFrameCounter - > front ( ) ;
@ -996,77 +982,23 @@ 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 ;
}
}
void WriteData2Disk : : exitWriteData2Disk ( )
void WriteData2Disk : : exitWriteData2Disk ( )
{
{
std : : cout < < " 执行函数: WriteData2Disk::exitWriteData2Disk " < < std : : endl ;
isExitWriteData2Disk = true ;
isExitWriteData2Disk = true ;
}
}