Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.140.108] |
|
Сообщ.
#1
,
|
|
|
при разработке своей проблеммы столкнулся с необходимостью создания MemHandle > 64K
после долгих поисках в Интернете наткнулся на данный кусочек кода #if defined (__palmosarm__) #include <PalmOneARM.h> #include <MemoryMgr.h> #elif defined (__palmos__) #include <PalmOS.h> SysAppInfoPtr SysGetAppInfo(SysAppInfoPtr *uiAppPP, SysAppInfoPtr *actionCodeAppPP) SYS_TRAP(sysTrapSysGetAppInfo); #define memNewChunkFlagAllowLarge 0x1000 #endif static void *large_malloc(unsigned long size) { unsigned long ownerID; #if defined (__palmosarm__) SysAppInfoV50Type *blankAppInfoP = NULL; #elif defined (__palmos__) SysAppInfoPtr blankAppInfoP; #endif ownerID = SysGetAppInfo(&blankAppInfoP, &blankAppInfoP)->memOwnerID; return MemChunkNew(0, size, ownerID | memNewChunkFlagNonMovable | memNewChunkFlagAllowLarge); } но вся беда в том что этот код дает NonMovable указатель и MemHandle из него не получить я изменил код и вот что получилось //Semen 3.9.6 VoidHand LargeHandleNew(ULong size) { SysAppInfoPtr blankAppInfoP; MemPtr pReturn; MemHandle hReturn; unsigned long ownerID; ULong free1, max1, free2, max2, free3, max3 ; Err ret; MemHeapFreeBytes(0,&free1,&max1 ); ownerID = SysGetAppInfo(&blankAppInfoP, &blankAppInfoP)->memOwnerID; pReturn = MemChunkNew(0, size, ownerID | memNewChunkFlagPreLock| memNewChunkFlagAllowLarge); MemHeapFreeBytes(0,&free2,&max2 ) ; hReturn = MemPtrRecoverHandle(pReturn); ret=MemHandleUnlock(hReturn) ; if (hReturn==NULL) { MemHeapCompact(0) ; MemHeapFreeBytes(0,&free3,&max3 ) ; pReturn = MemChunkNew(0, size, ownerID | memNewChunkFlagPreLock | memNewChunkFlagAllowLarge); hReturn = MemPtrRecoverHandle(pReturn); } return hReturn ; } В принципе все работает как надо(проверенно на Emulator и Palm Treo 680), но что то очень не спакойно на душе что скажете гуру? |
Сообщ.
#2
,
|
|
|
А чем
return (LocalID)MemChunkNew(0, size, memNewChunkFlagAllowLarge); не устраивает? Ну хорошо, Compact сделать можно, если что не так. |
Сообщ.
#3
,
|
|
|
igor_n +1
Sabsem, мы не ищем лёгких путей? Если установлен флаг memNewChunkFlagNonMovable, то MemChunkNew возвращает MemPtr, если не установлен, то MemHandle. На ownerID можно забить, при условии, что этот кусок памяти будет осовбождён вызовом MemChunkFree, если не освободишь, то этот чанк будет принадлежать системе (ownerID = 0) и он не будет освобождён при выходе из программы. |
Сообщ.
#4
,
|
|
|
ну как бы я таких решений раньше не всречал, а тут просто логически подумал и написал выше приведенную функцию
Проверил на работе практически функции с MemHandle и пришел к выводу что все работает Просто немного не понятно если оказалость все так просто почему Разработчики на Palm OS активно с это не используют Ведь ограничение при работе с большими массивами памяти это ахилесова пята в Palm OS |
Сообщ.
#5
,
|
|
|
У машинки TT динамической памяти 1Мб. Что означает, что блоков по 64К можно выделить всего лишь 16. С учетом того, что кил 200 может отъесть TCP-стек и сама операционка, не разгуляешься. А если ещё сидит пара резидентов, то памяти ещё меньше. А ещё эти резиденты память пофрагментировали знатно. Так что кроме написания такого кода нужно набраться терпения и наглости объяснять пользователям, что им нужно выключить всё резиденты и запускать программу после ресета. Для примера посмотри на типичные вопросы про портанутые программы типа PalmPDF, эмуляторов консолей итд.
Вообщем все пользуются тем соображением, что лучше использовать несколько маленьких блоков вместо одного большого. Типа совместимее. |
Сообщ.
#6
,
Сообщение отклонено: Arny -
|
Сообщ.
#7
,
Сообщение отклонено: Arny -
|
Сообщ.
#8
,
Сообщение отклонено: Arny -
|