ניהול גמיש

אחד היתרונות של FPC על פני הרבה מהדרים אחרים של השפה הוא בכך שהוא מאפשר לנו ליצור ניהול גמיש של זיכרון, מחרוזות ועוד.

הכוונה היא כמובן אספקת API אחיד, אבל לשנות את המימוש של הAPI הזה לפי מה שאנחנו רוצים. הדגמתי בעבר את cmem אשר בעצם מחליף את מנהל הזיכרון ברירת המחדל של ה RTL ומשתמש ב malloc של libc במקום. אבל FPC מאפשר לנו להחליף הרבה יותר מרק ניהול זיכרון. יותר מזה, ההחלפה היא לא עבור כל אפליקציה אלא רק עבור יחידה שנרצה שזה יהיה בה המצב, כך שאפשר להשתמש במנהל המתאים במקום המתאים.

שינוי המנהלים מתבצע על ידי שינוי רשומה המכילה API ועבודה עם פונקציות מתאימות לרישום הרשומה.
בברירת מחדל ניתן ליצור מנהלים חדשים עבור Variants, Threads, ניהול זיכרון, מנהלי משאבים (תמונות וכו' למשל אשר יכולות להיכנס לקובץ הריצה או חיצוניים מאוגדים לקובץ אחד), Unicode ו WideString.

מה שקורה הוא שעבור רשומה מסויימת יש callback אשר אנחנו צריכים "לאייש" בשביל שתהיה תמיכה כלשהי באותה פקודה. העניין הוא שאנחנו לא צריכים אבל לשכתב תכנה ולשים בה פתאום פקודות לא מוכרות. כלומר גם אם אני עובד עם ניהול זיכרון של cmem, אשר מנהל עבורינו את הזיכרון עם malloc, עדיין הפקודות שלי נשארות זהות, כלומר GetMem. הפקודה GetMem למעשה, בפועל מריץ את הcallback המתאים לפי מה שנרשם ליחידה בשימוש.

אז איך גורמים לכך שהרישום ישפיע על כל היחידה שאנחנו עובדים איתה אתם בטח שואלים, ובכן מגדירים את הרישום בחלק הInitialization (או begin, אם אתם "old-school") של היחידה:

...
implementation
...
Const
 CMemoryManager : TMemoryManager =
    (
      NeedLock : false;
      GetMem : @CGetmem;
      FreeMem : @CFreeMem;
      FreememSize : @CFreememSize;
      AllocMem : @CAllocMem;
      ReallocMem : @CReAllocMem;
      MemSize : @CMemSize;
      InitThread : nil;
      DoneThread : nil;
      RelocateHeap : nil;
      GetHeapStatus : @CGetHeapStatus;
      GetFPCHeapStatus: @CGetFPCHeapStatus;
    );

Var
  OldMemoryManager : TMemoryManager;

Initialization
  GetMemoryManager (OldMemoryManager);
  SetMemoryManager (CmemoryManager);

Finalization
  SetMemoryManager (OldMemoryManager);
end.

מתוך קוד המקור של cmem.

חשוב לזכור כי היחידה שבה אנחנו רוצים להשתמש כרשם חדש, צריכה להיות הראשונה משמאל בהגדרות ה uses עוד בחלק ה interface.

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s