MemHandleNew() в PalmOS не может выделить большой блок
От: WhiningHal Россия  
Дата: 06.10.04 14:48
Оценка:
Здравствуйте.

Столкнулся с такой проблемой:
Надо в текстовом поле отобразить большой (около 180Кбайт) текст, а если памяти не хватает, то хотя бы его кусок.
Я поступаю так: сначала запрашиваю размер максимального блока памяти с помощью функции MemHeapFreeBytes(), потом вычитаю из этого размера (на вский случай из этого, а не из общего объёма свободной памяти) 64К на другие нужды, потом отвожу память.
Но память не отводится, хоть её и много!
Tungsten T3, Palm OS 5.2.1, сообщает, что у него свободно 325Кбайт непрерывного пространства ОЗУ (имеется в виду Dynamic heap, а не вся память), но при попытке выделения блока 180Кбайт обламывается, возвращая NULL. Так же ведут себя и эмуляторы.

Собственно вопросы:
1. В чём я ошибаюсь?
2. Как получить большой блок памяти для текста, чтобы потом передать его функции fldSetTextHandle() ?
Re: MemHandleNew() в PalmOS не может выделить большой блок
От: AlexZu Россия  
Дата: 06.10.04 16:05
Оценка:
Здравствуйте, 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, запись в нее немного медленее, зато ее много
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.