У меня есть проект Visual Studio 2008 C ++ для Windows Mobile 6 ARMV4I, в котором я использую файлы с отображенной памятью.К сожалению, это приводит к блокировке устройства.Я могу продемонстрировать проблему с этим кодом:
#include <list>
#include <algorithm>
int _tmain(int argc, _TCHAR* argv[])
{
DWORD alloc_size = 256;
DWORD alloc_max = 16 * 1024 * 1024;
DWORD alloc_count = alloc_max / alloc_size;
HANDLE f = ::CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, alloc_max, NULL );
std::list< void* > l;
for( DWORD i = 0; i < alloc_count; ++i )
{
// device freezes after 65529 iterations
l.push_back( ::MapViewOfFile( f, FILE_MAP_READ | FILE_MAP_WRITE, 0, i * alloc_size, alloc_size ) );
}
std::for_each( l.rbegin(), l.rend(), ::UnmapViewOfFile );
::CloseHandle( f );
return 0;
}
Классический эмулятор Windows Mobile 6 Classic зависнет после 65529 итераций в моем тестировании.Это что-то, что я делаю неправильно, или есть проблема с платформой, о которой я должен знать?
Спасибо, PaulH
Редактировать: Увеличение до / STACK: 1048576,4096 позволяет мне выполнить 65535 итераций до того, как устройство зависнет.
Edit2: Согласно GlobalMemoryStatus
непосредственно перед отказом, устройство имеет 70,5 МБ / 94,1 МБ свободной физической памяти.
Edit3 : я могу создать две MMF и загрузить их до 65500 * 256 байт.Но ни один из них не может превышать 65535 по отдельности.На самом деле, размер alloc не имеет значения.Я могу сократить его пополам до 128 байт каждая, но все равно не могу выполнить> 65535 итераций.
Edit4: Поддержка MMF с реальным файлом, похоже, не имеет значения.Ошибка в> 65535 итерациях.