نوشته شده توسط
glyas47
سلام من یه برنامه شبیه گالری عکس درست کردم که بعد از مشخص کردن پوشه موردنظر ، برنامه عکس های درون آنرا بصورت گالری در پنجره ای پشت هم باز میکند که میتوان بعد از کلیلک روی هر عکس ، بزرگ شده عکس را در پنجره ای داخل برنامه مشاهده کرد ولی زمانیکه 50 یا بیشتر عکس که داخل برنامه بارگزاری میشه دیگه بعد از آن هیچ عکسی داخل picturebox های برنامه نمایش داده نمیشه تا اینکه برنامه را کلا ببندم و دوباره باز کنم که دوباره تا تعدادی عکس نمایش بده .هیچ اروری هم نمیده فقط دیگه نمایش نمیده.
باید چه کنم؟
مثال پیوستی رو ببینید :
PhotoBrowserSample.zip
اصولی که من در اینجور موارد رعایت می کنم اینهاست :
- اگر کاربر در این لحظه باید تصویر شماره 4 رو ببینه، اولویت اینه که با حداکثر سرعت تصویر شماره 4 فراخوانی و نمایش داده بشه. سایر عملیاتی که میخواهیم انجام بدیم باید در اولویت های بعدی قرار بگیرند.
- خوبه که چندین عکس رو فراخوانی کنم و در cache نگهدارم ولی هرگز کاربر رو برای فراخوانی تصاویری که الان نمیخواد ببینه معطل نخواهم کرد.
- چون معمولا مرور تصاویر به سمت بالا و پایین لیست فایل ها است و پیمایش متوالی است، چند تصویر قبلی و چند تصویر بعدی رو در حافظه cache فراخوانی می کنم تا سرعت نمایش اونها افزایش پیدا کنه.
- فراخوانی باید در نخ مجزایی باشه، نه در نخ اصلی برنامه تا برنامه موقع فراخوانی سکته نکنه.
- در کار GC دخالت نخواهم کرد، وظیفه من به عنوان برنامه نویس یک زبان سطح بالا مثل #C که مدیریت حافظه خودکار داره اینه که هر زمان که دیدم دیگر نیازی به یک شی Disposable شدنی ندارم، به سادگی Dispose اش کنم، فقط همین.
اینکه حافظه های بلااستفاده مدیریت شده (Managed) در همون لحظه آزاد نمیشه دلایل منطقی داره، بیخودی نیست که GC در آزاد کردنشون عجله نمیکنه.
من به GC درخواست نمیدم که یالا آزادشون کن، دخالت نمی کنم. GC خودش هر زمانی که مفید بدونه حافظه بلااستفاده رو آزاد میکنه تا به سیستم عامل برگردونه.
GC عملکرد بی نقص و فوق العاده ای نداره اما دخالت من هم اونقدر ها که بنظر خودم میاد مفید نیست.
- از Image.FromFile استفاده نخواهم کرد، چون روتینش طوریه که فایل رو بعد باز کردن گرو نگه میداره و Lock میشه و کاربر نمیتونه فایلش رو Rename یا Delete یا ... بکنه، حتی وقتی دیگه تصویر رو نمیبینه.
وقتی کاربر تصویری رو روی فرم نمیبینه از دید اون نباید فایلش مشغول باشه. وقتی اطلاعات تصویر رو در حافظه RAM خوندیم اساسا دیگه احتیاجی به فایلش نداریم.
بجای Image.FromFile خودم فایل رو میخونم و Image.FromStream رو بکار می برم تا بعدش فایل رو ببندم.