初始化的时候:
m_hFile = ::CreateFile(m_FileName.c_str(),GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
m_qwFileSize = 0x4000000;
m_qwFileOffset = 0;
m_T = 600 * m_siInfo.dwAllocationGranularity;
m_dwBytesInBlock = 1000 * m_siInfo.dwAllocationGranularity; m_hMappingFile = ::CreateFileMapping(m_hFile,NULL,PAGE_READWRITE,0,m_qwFileSize,NULL);
::CloseHandle(m_hFile);
m_lpStartLoc = ::MapViewOfFile(m_hMappingFile,FILE_MAP_ALL_ACCESS,
static_cast<DWORD>(m_qwFileSize >> 32),static_cast<DWORD>(m_qwFileOffset & 0xFFFFFFFF),m_dwBytesInBlock);然后当使用率到达60%的时候,重新创建内存映射,但是说我无法访问!!
if (m_qwFileOffset > m_T)
{
m_T = m_qwFileOffset + 600 * m_siInfo.dwAllocationGranularity;
::UnmapViewOfFile(m_lpStartLoc); DWORD dwHi = static_cast<DWORD>(m_qwFileOffset >> 32);
DWORD dwLo = static_cast<DWORD>(m_qwFileOffset & 0xFFFFFFFF); RndToSysAllocGranularity(dwHi);
RndToSysAllocGranularity(dwLo); m_lpStartLoc = ::MapViewOfFile(m_hMappingFile,FILE_MAP_ALL_ACCESS,dwHi,
dwLo,m_dwBytesInBlock);
}
RndToSysAllocGranularity是用于做分配粒度处理。
DWORD dwDevided = dwValue / m_siInfo.dwAllocationGranularity;//分配了多少粒度
DWORD dwRemains = dwValue % m_siInfo.dwAllocationGranularity; if (dwRemains)
dwValue = (dwDevided + 1) * m_siInfo.dwAllocationGranularity;//分配一个新的粒度。麻烦高人看看。觉得很纳闷,我估计是分配粒度这边的问题,但是不知道如何修改。
m_hFile = ::CreateFile(m_FileName.c_str(),GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
m_qwFileSize = 0x4000000;
m_qwFileOffset = 0;
m_T = 600 * m_siInfo.dwAllocationGranularity;
m_dwBytesInBlock = 1000 * m_siInfo.dwAllocationGranularity; m_hMappingFile = ::CreateFileMapping(m_hFile,NULL,PAGE_READWRITE,0,m_qwFileSize,NULL);
::CloseHandle(m_hFile);
m_lpStartLoc = ::MapViewOfFile(m_hMappingFile,FILE_MAP_ALL_ACCESS,
static_cast<DWORD>(m_qwFileSize >> 32),static_cast<DWORD>(m_qwFileOffset & 0xFFFFFFFF),m_dwBytesInBlock);然后当使用率到达60%的时候,重新创建内存映射,但是说我无法访问!!
if (m_qwFileOffset > m_T)
{
m_T = m_qwFileOffset + 600 * m_siInfo.dwAllocationGranularity;
::UnmapViewOfFile(m_lpStartLoc); DWORD dwHi = static_cast<DWORD>(m_qwFileOffset >> 32);
DWORD dwLo = static_cast<DWORD>(m_qwFileOffset & 0xFFFFFFFF); RndToSysAllocGranularity(dwHi);
RndToSysAllocGranularity(dwLo); m_lpStartLoc = ::MapViewOfFile(m_hMappingFile,FILE_MAP_ALL_ACCESS,dwHi,
dwLo,m_dwBytesInBlock);
}
RndToSysAllocGranularity是用于做分配粒度处理。
DWORD dwDevided = dwValue / m_siInfo.dwAllocationGranularity;//分配了多少粒度
DWORD dwRemains = dwValue % m_siInfo.dwAllocationGranularity; if (dwRemains)
dwValue = (dwDevided + 1) * m_siInfo.dwAllocationGranularity;//分配一个新的粒度。麻烦高人看看。觉得很纳闷,我估计是分配粒度这边的问题,但是不知道如何修改。
解决方案 »
- DECLARE_DYNAMIC为什么要放在类里面
- 求助!关于线程的两个问题。
- 如何从屏幕坐标获的3D坐标-OpenGL?
- 救命啊LNK2005错误~~~该如何解决阿?
- ★★★★这个问题困扰我很久了,我用VC+ADO+SQL2k,为什么出现这样的问题?
- 有关文件拖放的延迟方式(DelayRenderData)的问题,哪位兄弟有经验,多多指教!!!!!!!!!!
- VC对话框画坐标轴
- 问一下,我们国内有没有开发像联众那样的在线游戏的开发商呀?
- VC 传递 BSTR 给 COM , COM 传递 BSTR 给 VC
- 我想把ELF(EXECUTABLE AND LINKABLE FORMAT)转为其它格式,谁有ELF中文文档!!!
- 困扰我一周的问题,难倒无数高手,你能搞定吗??...(控件的载入!)
- 急,各位大师,请问一下编译错的,什么原因?谢谢
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
m_qwFileSize = 0x4000000;
m_qwFileOffset = 0;
m_T = 600 * m_siInfo.dwAllocationGranularity;
m_dwBytesInBlock = 1000 * m_siInfo.dwAllocationGranularity; m_hMappingFile = ::CreateFileMapping(m_hFile,NULL,PAGE_READWRITE,0,m_qwFileSize,NULL); //::CloseHandle(m_hFile); m_lpStartLoc = ::MapViewOfFile(m_hMappingFile,FILE_MAP_ALL_ACCESS,
static_cast <DWORD> (m_qwFileSize > > 32),static_cast <DWORD> (m_qwFileOffset & 0xFFFFFFFF),m_dwBytesInBlock);
换个方法提问吧:
当View的位移超过一个阈值的时候,我会重新CreateFile、CreateFileMapping、MapViewOfFile,这样的思路难道有错?!
m_hMappingFile = ::CreateFileMapping(m_hFile,NULL,PAGE_READWRITE,0,m_qwFileSize,NULL); ::CloseHandle(m_hFile);
这样再试试
::UnmapViewOfFile(m_lpStartLoc);
::CloseHandle(m_hMappingFile);
m_hMappingFile = ::CreateFileMapping(m_hFile,NULL,PAGE_READWRITE,0,m_qwFileSize,NULL);
static_cast <DWORD> (m_qwFileSize > > 32),static_cast <DWORD> (m_qwFileOffset & 0xFFFFFFFF),m_dwBytesInBlock红色的两处是笔误码?
[pre]
if (!m_hFile || INVALID_HANDLE_VALUE == m_hFile)
m_hFile = ::CreateFile(m_szFileName.c_str(),
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (!m_hFile || INVALID_HANDLE_VALUE == m_hFile)
{
AfxMessageBox("C_DumpSRParas::CreateMem() Error!");
return false;
} //::SetFilePointer(m_hFile,0,NULL,FILE_END);
DWORD dwSysGran = m_si.dwAllocationGranularity;
DWORD dwFileSizeLo = 0;
DWORD dwFileSizeHi = 0;
dwFileSizeLo = ::GetFileSize(m_hFile,&dwFileSizeHi);
__int64 qwFileSizeHi = dwFileSizeHi;
qwFileSizeHi <<= 32;
__int64 qwFileSize = dwFileSizeLo | qwFileSizeHi;
if (qwFileSize == 0)
{
DWORD dwWritten = 0;
CString str;
str = _T("\r\n");
::WriteFile(
m_hFile,
(LPCTSTR)str,
str.GetLength(),
&dwWritten,
NULL);
}
dwFileSizeLo = ::GetFileSize(m_hFile,&dwFileSizeHi);
qwFileSize = dwFileSizeLo | qwFileSizeHi; __int64 qwFileMapStart = qwFileSize / dwSysGran * dwSysGran;
DWORD dwMapViewSize = (static_cast<DWORD>(qwFileMapStart) % dwSysGran) + m_si.dwAllocationGranularity; //size of the file mapping view
__int64 qwFileMapSize = qwFileSize + m_si.dwAllocationGranularity; // How large will the file mapping object be? // The data of interest isn't at the beginning of the
// view, so determine how far into the view to set the pointer.
DWORD dwViewDelta = static_cast<DWORD>(qwFileSize - qwFileMapStart); m_hMem = ::CreateFileMapping(m_hFile,
NULL,
PAGE_READWRITE,
static_cast<DWORD>(qwFileMapSize >> 32),
static_cast<DWORD>(qwFileMapSize & 0xffffffff),
NULL);
if (m_hMem == NULL || INVALID_HANDLE_VALUE == m_hMem)
{
::CloseHandle(m_hFile);
m_hFile = NULL;
AfxMessageBox("C_DumpSRParas::CreateMem() Error!");
return false;
} m_pMemoryBlockBase = reinterpret_cast<LPDWORD>(::MapViewOfFileEx(
m_hMem,
FILE_MAP_ALL_ACCESS,
static_cast<DWORD>(qwFileMapStart >> 32),
static_cast<DWORD>(qwFileMapStart & 0xffffffff),
dwMapViewSize, //Number of bytes to map
NULL));
if (!m_pMemoryBlockBase)
{
::CloseHandle(m_hFile);
m_hFile = NULL;
::CloseHandle(m_hMem);
m_hMem = NULL; AfxMessageBox("C_DumpSRParas::CreateMem() Error!");
return false;
} m_pbtData = static_cast<LPBYTE>(m_pMemoryBlockBase) + dwViewDelta;
m_dwOffset += dwViewDelta;
m_dwOffset %= m_si.dwAllocationGranularity;
[/pre]