¾Õ¿¡¼ Á¤Çß´ø ·¹ÄÚµå °ü¸® ¿øÄ¢ Áß ¼¼ ¹ø° ¿øÄ¢Àº ¸Þ¸ð¸®ÀÇ ³¶ºñ¸¦ ¾ø¾Ö±â À§ÇØ ·¹ÄÚµå Å©±âÀÇ »óÇÑ°ªÀ» µÎ´Â °ÍÀ̾ú´Ù. ·¹ÄÚµå Å©±âÀÇ ÃÑÇÕÀÌ ÀÏÁ¤ ¿ë·®¿¡ À̸£¸é À߶ó¹ö¸®ÀÚ´Â ¿øÄ¢ÀÌ´Ù. ÀÌ ¿øÄ¢Àº ¾ÆÁ÷ ±¸ÇöµÇÁö ¾Ê¾Ò´Âµ¥ ¸ðµç ±â´ÉÀ» ¿Ï¼ºÇßÀ¸¹Ç·Î ÀÌÁ¦ ±¸ÇöÇغ¸ÀÚ.
¹®¼¸¦ °è¼Ó ÆíÁýÇϸé Ãë¼Ò ·¹ÄÚµå´Â ÆíÁý µ¿ÀÛÀ» ±â¾ïÇϱâ À§ÇØ °è¼Ó ½×¿© °¡¹Ç·Î ¸Þ¸ð¸®¸¦ °è¼Ó ¼ÒºñÇÏ°Ô µÈ´Ù. Ãë¼Ò ·¹ÄÚµå´Â ÆíÁý µ¿ÀÛ¿¡ ´ëÇÑ ¸ðµç °ÍÀ» ´Ù Æ÷ÇÔÇϱ⠶§¹®¿¡ º¸Åë ¹®¼ ÀÚüÀÇ Å©±âº¸´Ù 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¸¦ È£ÃâÇÒ ¶§´Â ·¹ÄÚµå ¿ë·®¿¡ º¯È°¡ ¾øÀ¸¹Ç·Î ±»ÀÌ »óÇѼ± Á¡°ËÀ» ÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ÀÌ ÇÔ¼ö´Â °á±¹ »ç¿ëÀÚÀÇ ´À¸° Å° Á¶ÀÛ¿¡ ÀÇÇØ È£ÃâµÇ¹Ç·Î ÀÏ´ÜÀº ±×·± 󸮸¦ »ý·«ÇÏ¿´´Ù.