¸¶. Ãë¼Ò ·¹ÄÚµåÀÇ »óÇÑ°ª

¾Õ¿¡¼­ Á¤Çß´ø ·¹ÄÚµå °ü¸® ¿øÄ¢ Áß ¼¼ ¹ø° ¿øÄ¢Àº ¸Þ¸ð¸®ÀÇ ³¶ºñ¸¦ ¾ø¾Ö±â À§ÇØ ·¹ÄÚµå Å©±âÀÇ »óÇÑ°ªÀ» µÎ´Â °ÍÀ̾ú´Ù. ·¹ÄÚµå Å©±âÀÇ ÃÑÇÕÀÌ ÀÏÁ¤ ¿ë·®¿¡ À̸£¸é À߶ó¹ö¸®ÀÚ´Â ¿øÄ¢ÀÌ´Ù. ÀÌ ¿øÄ¢Àº ¾ÆÁ÷ ±¸ÇöµÇÁö ¾Ê¾Ò´Âµ¥ ¸ðµç ±â´ÉÀ» ¿Ï¼ºÇßÀ¸¹Ç·Î ÀÌÁ¦ ±¸ÇöÇغ¸ÀÚ.

¹®¼­¸¦ °è¼Ó ÆíÁýÇϸé Ãë¼Ò ·¹ÄÚµå´Â ÆíÁý µ¿ÀÛÀ» ±â¾ïÇϱâ À§ÇØ °è¼Ó ½×¿© °¡¹Ç·Î ¸Þ¸ð¸®¸¦ °è¼Ó ¼ÒºñÇÏ°Ô µÈ´Ù. Ãë¼Ò ·¹ÄÚµå´Â ÆíÁý µ¿ÀÛ¿¡ ´ëÇÑ ¸ðµç °ÍÀ» ´Ù Æ÷ÇÔÇϱ⠶§¹®¿¡ º¸Åë ¹®¼­ ÀÚüÀÇ Å©±âº¸´Ù 4~5¹è Á¤µµ ´õ Å©´Ù. ¸¸¾à 1MBÀÇ ¹®¼­¸¦ ÆíÁýÇß´Ù¸é 4~5MB Á¤µµÀÇ Ãë¼Ò ·¹Äڵ尡 »ý¼ºµÇ¸ç »ðÀÔ, »èÁ¦, À̵¿À» ºó¹øÇÏ°Ô Çß´Ù¸é ÀÌ Å©±â´Â ´õ¿í Ä¿Áú °ÍÀÌ´Ù.

¹èº¸´Ù ¹è²ÅÀÌ ´õ Ä¿Áø »óȲÀε¥ ÀÌ ·¹ÄÚµåµéÀ» ¸ðµÎ À¯ÁöÇÑ´Ù¸é ¹®¼­¸¦ ÃÖÃÊ ÀÔ·ÂÇϱâ ÀüÀÇ »óÅ·Π¿Ïº®ÇÏ°Ô º¹±¸ÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ÀÌ·± ±â´ÉÀ» ¿øÇÏ´Â »ç¿ëÀÚ´Â º°·Î ¾ø´Ù. ½ÇÇàÃë¼Ò ±â´ÉÀº °íÀÛÇØ¾ß ¸î ½Ê ¹ø ÀÌÀüÀÇ ÆíÁý µ¿ÀÛ±îÁö¸¸ ½ÇÁúÀûÀ¸·Î À¯È¿ÇÏ¸ç ¸î õ ¹ø Àü¿¡ ÀÔ·Â ¶Ç´Â »èÁ¦Çß´ø ÆíÁýÀ» Ãë¼ÒÇÒ °æ¿ì¶õ ¹«Ã´ µå¹°´Ù. Ãë¼Ò ·¹ÄÚµå º¸À¯·®ÀÌ ¸¹À¸¸é ¸¹À»¼ö·Ï Ãë¼ÒÇÒ ¼ö ÀÖ´Â °Å¸®´Â ´Ã¾î³ª°ÚÁö¸¸ ±×·Î ÀÎÇÑ ¸Þ¸ð¸® »ç¿ë Áõ°¡¿Í ÀüüÀûÀÎ ½Ã½ºÅÛ ¼º´É ÀúÇ϶ó´Â ¹Ý´ë ±ÞºÎ°¡ ÀÖÀ¸¹Ç·Î Àû´çÇÑ ¼±¿¡¼­ Ãë¼Ò ·¹ÄÚµåÀÇ ÃÖÀû º¸À¯·®À» °áÁ¤ÇØ¾ß ÇÑ´Ù.

¾ÆÁÖ ¿À·¡ Àü¿¡ ±â·ÏÇسõÀº Ãë¼Ò ·¹ÄÚµå´Â ÃÖ±ÙÀÇ ·¹Äڵ忡 ºñÇØ ½Ç¿ë¼ºÀÌ ¶³¾îÁö¹Ç·Î »èÁ¦Çصµ º° »ó°üÀÌ ¾ø´Ù. »ç¿ëÀÚ°¡ õ ¹øÀ» ÆíÁýÇß´Ù¸é ±× Áß ¾ÕÂÊ 500°³ÀÇ ·¹ÄÚµå´Â ¶Ò Àß¶ó¼­ ¹ö·Áµµ 500¹ø Undo¸¦ Çغ¸±â Àü¿¡´Â ÀÌ »ç½ÇÀ» ´«Ä¡Ã§ ¼öµµ ¾ø´Ù. ±×·¸´Ù°í Çؼ­ 10¹ø ÆíÁýÇߴµ¥ 5°³¸¦ Àß¶ó¼­ ¹ö¸®¸é ±Ý¹æ µéÅ볯 °ÍÀÌ´Ù. ±×·¡¼­ Ãë¼Ò ·¹ÄÚµåÀÇ Àû´çÇÑ º¸À¯·®À» Àß °áÁ¤ÇØ¾ß ÇÑ´Ù.

Ãë¼Ò ·¹ÄÚµåÀÇ º¸À¯ »óÇѼ±À» ÁöÁ¤ÇÏ´Â ±âÁØ¿¡´Â µÎ °¡Áö°¡ ÀÖ´Ù. ¿ì¼± Ãë¼Ò ·¹ÄÚµåÀÇ °³¼ö¸¦ ±âÁØÀ¸·Î ÇÒ ¼ö Àִµ¥ ¿¹¸¦ µé¾î 1000°³±îÁö¸¸ Çã¿ëÇÑ´Ù¸é 1000°³°¡ ³ÑÀ» ¶§ ¾ÕÂÊ ·¹Äڵ带 À߶ó¹ö¸®´Â °ÍÀÌ´Ù. µÎ ¹ø°·Î ÃÑ ¿ë·®À» ±âÁØÀ¸·Î ÇÒ ¼ö Àִµ¥ Ãë¼Ò ·¹ÄÚµåÀÇ ÃÑ ¿ë·®ÀÌ 100KB°¡ µÇ¸é Àý¹Ý Á¤µµ¸¦ ¹ö¸°´Ù. ¾î¶² ±âÁØÀ» Ãë¼Ò ·¹ÄÚµåÀÇ »óÇѼ±À¸·Î Á¤ÇÏ´Â °ÍÀÌ °ú¿¬ ¿ÇÀ»±î?

Ãë¼Ò ·¹ÄÚµåÀÇ »óÇѼ±À» Á¤ÇÏ´Â ÁÖµÈ ÀÌÀ¯´Â ¸Þ¸ð¸®¸¦ Àý¾àÇÏÀÚ´Â °ÍÀ̹ǷΠÃÑ ¿ë·®À» ±âÁØÀ¸·Î ÇÏ´Â °ÍÀÌ ÀÏ´ÜÀº ÇÕ¸®ÀûÀÌ´Ù. 100°³ÀÇ ·¹Äڵ尡 °íÀÛ 10KB¹Û¿¡ ¾ÈµÇ´Â °æ¿ìµµ ÀÖ°í 10°³ÀÇ ·¹Äڵ尡 1MB¸¦ ³ÑÀ» ¼öµµ Àֱ⠶§¹®¿¡ ·¹ÄÚµåÀÇ °³¼ö´Â »ç¿ë ¸Þ¸ð¸®·®À» Á¤È®ÇÏ°Ô ¹Ý¿µÇÏÁö ¸øÇÑ´Ù. ±×·¯³ª °³¼öµµ ¹«½ÃÇÒ ¼ö´Â ¾ø´Ù. ÀÌ·± °æ¿ì¸¦ »ý°¢Çغ¸ÀÚ. ¿ë·®¸¸ 100KB »óÇѼ±À» µÎ¾ú´Âµ¥ »ç¿ëÀÚ°¡ 10KB, 30KB, 80KBÀÇ ÅؽºÆ®¸¦ ¼¼ ¹ø »èÁ¦Çß´Ù°í ÇÏÀÚ. ±×·¯¸é ÃÖÃÊ 10KB¸¦ »èÁ¦ÇÑ ·¹ÄÚµå´Â »ç¶óÁö¹Ç·Î µÎ ¹ø¹Û¿¡ Ãë¼Ò¸¦ ¸øÇÏ°Ô µÇ´Â ¼ÀÀÌ´Ù.

±×·¡¼­ ApiEdit´Â ÀÏ´Ü ÃÑ ¿ë·®À» ±âÁØÀ¸·Î Ç쵂 °³¼ö¿¡ ´ëÇؼ­µµ ÃÖ¼ÒÇÑÀÇ º¸À¯·®À» ÁöÁ¤ÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿´´Ù. Áï ÀÏÁ¤ °³¼ö ÀÌ»óÀÇ ·¹Äڵ尡 Çã¿ë ¿ë·®À» ÃÊ°úÇÒ ¶§¿¡ ÇÑÇؼ­¸¸ Ãë¼Ò ·¹ÄÚµåÀÇ ÀϺθ¦ »èÁ¦Çϵµ·Ï ÇÑ´Ù. ¼³»ç ¿ë·®À» ³Ñ¾ú´õ¶óµµ ÃÖ¼ÒÇÑÀÇ °³¼ö¸¸Å­Àº À¯ÁöÇÑ´Ù. ÀÌ Ã³¸®¸¦ À§ÇØ ´ÙÀ½ µÎ º¯¼ö¸¦ ¼±¾ðÇÏ¿´´Ù.

 

class CApiEdit

{

     ....

     int UndoSize;

     int UndoMin;

 

UndoSize´Â Ãë¼Ò ·¹ÄÚµåÀÇ Çã¿ë ÃÑ ¿ë·®À̸ç UndoMinÀº ÃÖ¼ÒÇÑ º¸À¯ÇØ¾ß ÇÒ Ãë¼Ò ·¹ÄÚµåÀÇ °³¼öÀÌ´Ù. SetDefaultSetting¿¡¼­ ÀÌ º¯¼öµéÀ» ´ÙÀ½°ú °°ÀÌ ÃʱâÈ­ÇÑ´Ù.

 

void CApiEdit::SetDefaultSetting()

{

     ....

     UndoSize=100*1024;

     UndoMin=100;

}

 

Çã¿ë ÃÑ ¿ë·®Àº 100KB·Î ÃʱâÈ­ÇßÀ¸¸ç ÃÖ¼Ò ·¹ÄÚµåÀÇ °³¼ö´Â 100°³ÀÌ´Ù. 100KB Á¤µµ¸é À¢¸¸Å­ÀÇ ÆíÁý µ¿ÀÛÀ» ±â¾ïÇϱ⿡´Â ºñ±³Àû ÃæºÐÇÑ ¿ë·®ÀÌ´Ù. ÅؽºÆ® ÆíÁý±â¶ó¸é 1MB Á¤µµ·Î ´Ã·Áµµ º° »ó°üÀº ¾ø°í ÇÑ À©µµ¿ì¿¡ ApiEdit¸¦ ¿©·¯ °³ »ç¿ëÇÑ´Ù¸é Á» ´õ ÁÙ¿©¾ß ÇÒ °ÍÀÌ´Ù. ÀÌ ¿ë·®ÀÇ ÃÖÀû°ªÀº ApiEdit¸¦ ¾î¶² ¿ëµµ·Î »ç¿ëÇϴ°¡¿¡ µû¶ó ´Þ¶óÁö´Â ÀÏÁ¾ÀÇ ¼³Á¤°ªÀÌ´Ù. ±×·¡¼­ È£½ºÆ®¿¡¼­ ÀÌ °ªÀ» º¯°æÇÒ ¼ö ÀÖµµ·Ï ÇØ¾ß ÇÒ ÇÊ¿ä°¡ ÀÖÀ¸¸ç ´ÙÀ½ ÇÔ¼öµéÀ» Ãß°¡ÇÑ´Ù.

 

class CApiEdit

{

     ....

     int GetUndoSize() { return UndoSize; }

     void SetUndoSize(int aSize);

     int GetUndoMin() { return UndoMin; }

     void SetUndoMin(int aMin);

 

Get ÇÔ¼ö´Â ¸ðµÎ ÀζóÀÎÀ¸·Î ÀÛ¼ºÇßÀ¸¸ç Set ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏ¿´´Ù.

 

void CApiEdit::SetUndoSize(int aSize)

{

     UndoSize=max(aSize,1024);

}

 

void CApiEdit::SetUndoMin(int aMin)

{

     UndoMin=max(aMin,10);

}

 

È£½ºÆ®°¡ ÁöÁ¤ÇÏ´Â Å©±â·Î º¯°æÇ쵂 ÃÑ ¿ë·®Àº ÃÖ¼ÒÇÑ 1KB Á¤µµ°¡ µÇµµ·Ï ÇßÀ¸¸ç ·¹ÄÚµå °³¼ö´Â ÃÖ¼ÒÇÑ 10°³°¡ µÇµµ·Ï ÇÏ¿´´Ù. ÀÌ ¼³Á¤°ªÀÌ º¯°æµÇ¸é ÇöÀç ÀÛ¼ºµÇ¾î ÀÖ´Â Ãë¼Ò ·¹ÄÚµåÀÇ °³¼öµµ Á¶Á¤ÇØ¾ß ÇÏ°ÚÁö¸¸ º¹ÀâÇϱ⠶§¹®¿¡ ±×·¸°Ô ÇÏÁö ¾Ê¾Ò´Ù. Set ÇÔ¼ö¿¡¼­ º¯¼ö°ª¸¸ ¹Ù²ã ³õÀ¸¸é ¹Ù·Î ´ÙÀ½ ÆíÁý½Ã¿¡ ÀÌ °ªÀÌ Àû¿ëµÇ¹Ç·Î ¹«¸®ÇÏ°Ô µ¿±âÈ­¸¦ ÇÒ ÇÊ¿ä±îÁö´Â ¾ø´Ù. ÀÌ »óÇÑ°ª¿¡ µû¶ó ·¹Äڵ带 °ü¸®ÇÏ´Â ÀÛ¾÷Àº »õ·Î ·¹Äڵ带 Ãß°¡ÇÏ´Â NextRecord ÇÔ¼ö¿¡¼­ ´ã´çÇÑ´Ù.

 

void CApiEdit::NextRecord()

{

    int i,j,size, size2,len;

 

     nowur++;

 

     if (nowur==URSize-1) {

          URSize+=64;

          pUR=(UndoRecord *)realloc(pUR,sizeof(UndoRecord)*URSize);

          memset(pUR+URSize-64,0,sizeof(UndoRecord)*64);

     }

 

    for (size=0,i=0;;i++) {

        if (pUR[i].action == UR_NONE)

           break;

        size += sizeof(UndoRecord)+_msize(pUR[i].data);

    }

 

    if (i > UndoMin && size > UndoSize) {

        for (size2=0,i=0;;i++) {

           size2 += sizeof(UndoRecord)+_msize(pUR[i].data);

           if (size2 > UndoSize/2)

               break;

        }

 

        for (j=0;j<=i;j++) {

            if (pUR[j].data)

               free(pUR[j].data);

        }

 

        len=nowur-i;

        memmove(pUR,&pUR[i+1],sizeof(UndoRecord)*len);

        memset(pUR+len,0,sizeof(UndoRecord)*(nowur-len));

        nowur=len-1;

    }

}

 

Ãë¼Ò ·¹ÄÚµå Àüü¸¦ ¼øȸÇÏ¸ç ·¹ÄÚµåÀÇ ÃÑ ¿ë·®°ú °³¼ö¸¦ ±¸ÇÑ´Ù. ±×¸®°í °³¼ö°¡ ÃÖ¼Ò °³¼öº¸´Ù ´õ Å©°í ÃÑ ¿ë·®ÀÌ Çã¿ë ¿ë·®À» ÃÊ°úÇßÀ¸¸é ¾ÕÂÊ ·¹Äڵ带 Àû´çÈ÷ Á¤¸®ÇÑ´Ù. ¿ë·®ÀÌ Àý¹ÝÀÌ µÇ´Â ÁöÁ¡À» ã¾Æ ±× ÀÌÀüÀÇ ·¹ÄÚµå´Â ¸ðµÎ »èÁ¦Çϵµ·Ï ÇÏ¿´´Ù.

Ãë¼Ò ·¹ÄÚµåÀÇ ÃÑ ¿ë·®À» ±¸ÇÏ´Â ·çÇÁ´Â Ãë¼Ò ·¹Äڵ尡 ¾ÆÁÖ ¸¹´Ù¸é ½Ã°£ÀÌ ´Ù¼Ò ¿À·¡ °É¸± ¼öµµ ÀÖ´Ù. ¼Óµµ¸¦ Çâ»ó½ÃÅ°·Á¸é ²À ÇÊ¿äÇÒ ¶§¸¸ »óÇѼ± Á¡°ËÀ» Çϵµ·Ï º°µµÀÇ ÇÔ¼ö·Î ºÐ¸®Çϰųª ¾Æ´Ï¸é NextRecord ÇÔ¼ö¿¡ bTestLimit °°Àº Àμö¸¦ µÎ¾î ºÒÇÊ¿äÇÑ »óÇѼ± Á¡°ËÀ» ÇÏÁö ¾Êµµ·Ï ¼öÁ¤ÇÏ¸é µÈ´Ù. ¿¹¸¦ µé¾î Redo¿¡¼­ NextRecord¸¦ È£ÃâÇÒ ¶§´Â ·¹ÄÚµå ¿ë·®¿¡ º¯È­°¡ ¾øÀ¸¹Ç·Î ±»ÀÌ »óÇѼ± Á¡°ËÀ» ÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ÀÌ ÇÔ¼ö´Â °á±¹ »ç¿ëÀÚÀÇ ´À¸° Å° Á¶ÀÛ¿¡ ÀÇÇØ È£ÃâµÇ¹Ç·Î ÀÏ´ÜÀº ±×·± 󸮸¦ »ý·«ÇÏ¿´´Ù.