На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование под PalmOS"
Правила раздела просты:
1. Будьте вежливыми.
2. Задавате вопросы только по теме. Пользовательские вопросы (у меня не работает пальм) являются оффтопиком. Пользуйтесь конференциями palmz.in, hpc.ru, ihand.ru .
3. Поиск вареза запрещен.
4. Пользуйтесь поиском. Не надейтесь, что кому-то доставляет удовольствие отвечать в сотый раз на один и тот же вопрос.
  
> Подводные камни при MemHandle > 64K , Подводные камни при MemHandle > 64K
    при разработке своей проблеммы столкнулся с необходимостью создания MemHandle > 64K
    после долгих поисках в Интернете наткнулся на данный кусочек кода
    ExpandedWrap disabled
      #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 из него не получить

    я изменил код и вот что получилось
    ExpandedWrap disabled
      //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), но что то очень не спакойно на душе
    что скажете гуру?
      А чем

      ExpandedWrap disabled
        return (LocalID)MemChunkNew(0, size, memNewChunkFlagAllowLarge);


      не устраивает? Ну хорошо, Compact сделать можно, если что не так.
        igor_n +1

        Sabsem, мы не ищем лёгких путей? :) Если установлен флаг memNewChunkFlagNonMovable, то MemChunkNew возвращает MemPtr, если не установлен, то MemHandle. На ownerID можно забить, при условии, что этот кусок памяти будет осовбождён вызовом MemChunkFree, если не освободишь, то этот чанк будет принадлежать системе (ownerID = 0) и он не будет освобождён при выходе из программы.
          ну как бы я таких решений раньше не всречал, а тут просто логически подумал и написал выше приведенную функцию
          Проверил на работе практически функции с MemHandle и пришел к выводу что все работает
          Просто немного не понятно если оказалость все так просто почему Разработчики на Palm OS активно с это не используют
          Ведь ограничение при работе с большими массивами памяти это ахилесова пята в Palm OS
            У машинки TT динамической памяти 1Мб. Что означает, что блоков по 64К можно выделить всего лишь 16. С учетом того, что кил 200 может отъесть TCP-стек и сама операционка, не разгуляешься. А если ещё сидит пара резидентов, то памяти ещё меньше. А ещё эти резиденты память пофрагментировали знатно. Так что кроме написания такого кода нужно набраться терпения и наглости объяснять пользователям, что им нужно выключить всё резиденты и запускать программу после ресета. Для примера посмотри на типичные вопросы про портанутые программы типа PalmPDF, эмуляторов консолей итд.

            Вообщем все пользуются тем соображением, что лучше использовать несколько маленьких блоков вместо одного большого. Типа совместимее.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0775 ]   [ 16 queries used ]   [ Generated: 19.04.24, 10:04 GMT ]