Здравствуйте.
Столкнулся с такой проблемой:
Надо в текстовом поле отобразить большой (около 180Кбайт) текст, а если памяти не хватает, то хотя бы его кусок.
Я поступаю так: сначала запрашиваю размер максимального блока памяти с помощью функции MemHeapFreeBytes(), потом вычитаю из этого размера (на вский случай из этого, а не из общего объёма свободной памяти) 64К на другие нужды, потом отвожу память.
Но память не отводится, хоть её и много!
Tungsten T3, Palm OS 5.2.1, сообщает, что у него свободно 325Кбайт непрерывного пространства ОЗУ (имеется в виду Dynamic heap, а не вся память), но при попытке выделения блока 180Кбайт обламывается, возвращая NULL. Так же ведут себя и эмуляторы.
Собственно вопросы:
1. В чём я ошибаюсь?
2. Как получить большой блок памяти для текста, чтобы потом передать его функции fldSetTextHandle() ?
Здравствуйте, WhiningHal, Вы писали:
WH>Здравствуйте.
WH>Столкнулся с такой проблемой:
WH>Надо в текстовом поле отобразить большой (около 180Кбайт) текст, а если памяти не хватает, то хотя бы его кусок.
WH>Я поступаю так: сначала запрашиваю размер максимального блока памяти с помощью функции MemHeapFreeBytes(), потом вычитаю из этого размера (на вский случай из этого, а не из общего объёма свободной памяти) 64К на другие нужды, потом отвожу память.
WH>Но память не отводится, хоть её и много!
WH>Tungsten T3, Palm OS 5.2.1, сообщает, что у него свободно 325Кбайт непрерывного пространства ОЗУ (имеется в виду Dynamic heap, а не вся память), но при попытке выделения блока 180Кбайт обламывается, возвращая NULL. Так же ведут себя и эмуляторы.
WH>Собственно вопросы:
WH>1. В чём я ошибаюсь?
Максимальный размер памяти которую вы можете выделить с пом. ф-й MemHandleNew (перемещаемая память) и MemPtrNew (неперемещаемая память) должен быть меньше чем 64k (точнее <= (0x0FFFF — 30)).
Память большого размера нужно выделять с пом. ф-и MemChunkNew и флагом memNewChunkFlagAllowLarge, см. пример для выделения неперемещаемой памяти большого размера (взят из какого-то примера с palmos.com):
SysAppInfoPtr SysGetAppInfo(SysAppInfoPtr *uiAppPP, SysAppInfoPtr *actionCodeAppPP)
SYS_TRAP(sysTrapSysGetAppInfo);
#define memNewChunkFlagAllowLarge 0x1000 // allow >64K allocations
static void * BigMemoryAlloc(Int32 size)
{
// Allocate a chunk of memory where the size of the memory might exceed
// 64k. There are a few potential problems here:
// (a) the memory cannot be saved to a database
// (b) if you forget to free the large chunk before
// you application quits, you will cause a MEMORY LEAK on
// Palm OS 5 and 5.1 .
if (size > 65500)
{
SysAppInfoPtr unusedAppInfoP;
UInt16 currentOwnerID = SysGetAppInfo(&unusedAppInfoP, &unusedAppInfoP)->memOwnerID;
return MemChunkNew(0, size, currentOwnerID | memNewChunkFlagNonMovable | memNewChunkFlagAllowLarge);
}
else return MemPtrNew(size);
}
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
static inline void BigMemoryFree(void * ptr)
{
// Memory allocated with MemChunkNew() and MemPtrNew() can both be
// freed with MemPtrFree(). There is never a need to call MemChunkFree().
ErrIf_(!ptr, "Invalid memory free");
MemPtrFree(ptr);
cleanup:
;
}
ps: большая ошибка исп-ть память такого большого размера. Исп-те память небольшими блоками, по мере необходимости подгружая в них необходимую инфориацию.
Другой вариант, исп-ть storage memory, запись в нее немного медленее, зато ее много