שיחרור משאבים (#c) - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

שיחרור משאבים (#c)


eido300

Recommended Posts

כשאני פותח משהו ע"י ;()showdialog אני צריך לשחרר אותו ע"י ;()dispose, או שמספיק לסגור (;()close)?

ובכללי יש כל מיני דברים שאני צריך לסגור ואחרי זה לפתוח עוד פעם (כמו את האפשרות להשמיע שיר דרך התוכנה בשעון הנ"ל), ואם אני משחרר אותם ע"י ;()dispose המהדר זורק חריג שאומר שא"א לפתוח "דברים שהושלכו", מה עושים בכאלה מקרים?

תודה רבה (וסליחה שאני חופר לכם עם כל השאלות).

קישור לתוכן
שתף באתרים אחרים

הדרך היחידה לדעת היא באמצעות התיעוד. קרא היטב את התיעוד של המתודה Form.Close, הוא בדיוק עונה לך על השאלה.

אגב, למיטב ידיעתי בדרך כלל מממשים את הפונקציה Dispose ככה שאם קוראים לה על אובייקט שכבר עשו לו Dispose, היא פשוט לא עושה כלום. החריגה ObjectDisposedException בדרך כלל נזרקת רק כשאתה מנסה לגשת למתודות אחרות של האובייקט.

קישור לתוכן
שתף באתרים אחרים

בקיצור אני צריך להשתמש בdispose.

החריג נזרק כאשר אני מנסה לפתוח אותו שוב עם showdialog, ובגלל זה אני לא יכול להשתמש בdispose, אלא רק בclose (מה שבתוכנות גדולות יכול לדפוק לי את המשאבים והזיכרון).

קישור לתוכן
שתף באתרים אחרים

  • 3 חודשים מאוחר יותר...

קראתי לא מזמן שבמערכות ההפעלה אם אני משתמש במשאב בתוכנה ולא משחרר אותו בתוכנה המחשב לא ישחרר אותו גם אחרי שסגרתי את התוכנה, מה שבעצם יכול לגרום שאם אני אכתוב תוכנה בצורה לא נכונה היא תגמור לי את המשאבים (ובעצם תגרום לי באיזהו שהוא שלב מתקפת DOS על המחשב שלי...) האם זה נכון? וא"כ איך אני אמור לשחרר משאב שאני לא יכול לשחרר תוך כדי ריצת התוכנה בגלל שיכול להיות שאצטרך אותו אח"כ (כגון פתיחת טופס ע"י showdialog, שאם אני אשחרר אותו אח"כ אני לא אוכל לפתוח אותו שוב)?

תודה.

קישור לתוכן
שתף באתרים אחרים

יכול להיות שזה היה נכון בעבר הרחוק, לפני ימי . היום זה לא ככה, חוץ ממשאבים שלא מנוהלים על ידי מערכת ההפעלה (נניח, יתכן שהמשאב הוא חיבור למסד נתונים שיש בו באג שדורש ניתוק מסודר של החיבור). Form הוא כמובן לא משאב כזה.

איפה קראת את זה?

קישור לתוכן
שתף באתרים אחרים

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

אתה כותב קוד ב-#C? למדת על ניהול משאבים והקצאות זיכרון?

אני כותב ב#c, וכן, למדתי על ניהול משאבים (למזלי ב#c לא מתעסקים עם זיכרון...) למדתי שיש משאבים שצריך לשחרר (לא פירטו איזה רק כתבו ש"יש משאבים שחשובים מדי מכדי לתת להם להשאר תפוסים שלא לצורך במשך זמן שרירותי" וצריך לשחרר אותם) בעזרת שיטות כמו close ו dispose (וכדי להיות בטוחים שהם יפונו צריך להשתמש בבלוק finaly).

יכול להיות שזה היה נכון בעבר הרחוק, לפני ימי windows xp. היום זה לא ככה, חוץ ממשאבים שלא מנוהלים על ידי מערכת ההפעלה (נניח, יתכן שהמשאב הוא חיבור למסד נתונים שיש בו באג שדורש ניתוק מסודר של החיבור). Form הוא כמובן לא משאב כזה.

איפה קראת את זה?

כאן עמ' 4 היה עוד מקום אבל אני לא זוכר כרגע.

אז במידה ואני לא אשחרר form בתוכנית שרצה על המחשב ללא הפסקה ויפתחו את הform שוב ושוב זה לא יתפוס יותר מדי משאבים?

קישור לתוכן
שתף באתרים אחרים

זה בכל מקרה לא נורא אם תשחרר את הform, כי הוא כן ישתחרר בסופו של דבר על ידי ה garbage collector.

מה שכתוב במאמר שקישרת אליו היה נכון רק במערכות ישנות יותר כמו 95, וגם זה לא היה באופן גורף.

קישור לתוכן
שתף באתרים אחרים

אז היום המערכת משחררת את זה לבד בסגירת התוכנה?

בform ה

garbage collector ישחרר את זה גם באמצע ריצת התוכנה? (כמובן לא כשהform פתוח) ואם הוא ישחרר את זה איך אח"כ יוכלו לפתוח את זה שוב, הרי זה נפתח בshowdialog ולא בתור form חדש?

תודה ומתנצל על החפירה.

קישור לתוכן
שתף באתרים אחרים

אז היום המערכת משחררת את זה לבד בסגירת התוכנה?

כמובן.

garbage collector ישחרר את זה גם באמצע ריצת התוכנה?

ודאי, זה התפקיד שלו.

ואם הוא ישחרר את זה איך אח"כ יוכלו לפתוח את זה שוב, הרי זה נפתח בshowdialog ולא בתור form חדש?

אתה לא מציג את אותו form בדיוק, אתה יוצר אובייקט חדש של אותה מחלקה ומציג אותו.

קישור לתוכן
שתף באתרים אחרים

אתה לא מציג את אותו form בדיוק, אתה יוצר אובייקט חדש של אותה מחלקה ומציג אותו.

אם זה בסך הכל אובייקט חדש של אותה מחלקה למה כל פעם שאני פותח את הטופס הוא מציג לי את הטופס עם כל השינויים שעשיתי בטופס הקודם (כגון checkbox, textbox וכו'...)?

קישור לתוכן
שתף באתרים אחרים

עשית לו new או שאתה משתמש באותו אובייקט שהיה לך קודם?

אם אתה משתמש באותו אובייקט אז הגיוני שזה מה שיקרה, הרי זה אותו אובייקט. אבל שים לב שאם עשית לו Dispose אז זה אסור ואתה חייב ליצור אובייקט חדש.

יעזור אם תעלה לכאן את הקוד.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...