PDA

View Full Version : سوال: عدم نمایش عکس ها



glyas47
شنبه 11 آبان 1398, 07:47 صبح
سلام من یه برنامه شبیه گالری عکس درست کردم که بعد از مشخص کردن پوشه موردنظر ، برنامه عکس های درون آنرا بصورت گالری در پنجره ای پشت هم باز میکند که میتوان بعد از کلیلک روی هر عکس ، بزرگ شده عکس را در پنجره ای داخل برنامه مشاهده کرد ولی زمانیکه 50 یا بیشتر عکس که داخل برنامه بارگزاری میشه دیگه بعد از آن هیچ عکسی داخل picturebox های برنامه نمایش داده نمیشه تا اینکه برنامه را کلا ببندم و دوباره باز کنم که دوباره تا تعدادی عکس نمایش بده .هیچ اروری هم نمیده فقط دیگه نمایش نمیده.

باید چه کنم؟

رامین مرادی
شنبه 11 آبان 1398, 09:01 صبح
سلام
با لود اینهمه عکس هم پردازش سیستمتون بالا میره هم مصرف حافظه.
بهتره برای این مورد از صفحه بندی استفاده کنید. برای مثال ابتدا ده عکس رو نشون بدید بعد اگه کاربر کلید صفحه بعد رو زد ده تای بعدی رو نشون بدید.

glyas47
شنبه 11 آبان 1398, 11:58 صبح
سلام
با لود اینهمه عکس هم پردازش سیستمتون بالا میره هم مصرف حافظه.
بهتره برای این مورد از صفحه بندی استفاده کنید. برای مثال ابتدا ده عکس رو نشون بدید بعد اگه کاربر کلید صفحه بعد رو زد ده تای بعدی رو نشون بدید.

عکس هایی که لود میکنم خیلی با کیفیت هستند و اینکاری که میگید رو انجام دادم ولی باز بعد از لود تعدادی عکس همون مشکل پیش میاد.

چطور میشه بعد از لود یه تعداد عکس در برنامه با بستن پنجره نمایش ، حافظه رم اختصاص یافته را آزاد کرد.فکر کنم اینطوری مشکل حل بشه .راهش بلد نیستم

glyas47
شنبه 11 آبان 1398, 13:08 عصر
مهندسین محترم کمک کنند نیاز شدید دارم

mr.sirwan
شنبه 11 آبان 1398, 20:06 عصر
شما لطفا کدهاتون رو بذارید اینجوری که نمیشه کمکی کرد

رامین مرادی
یک شنبه 12 آبان 1398, 12:22 عصر
یه بار قبل از هربار فراخوانی عکسهای جدید این کد رو اجرا کنید و نتیجه رو بگید


GC.Collect();
GC.WaitForPendingFinalizers();

glyas47
دوشنبه 13 آبان 1398, 09:19 صبح
شما لطفا کدهاتون رو بذارید اینجوری که نمیشه کمکی کرد




try
{
if (!string.IsNullOrWhiteSpace(_path))
{
Image im = Image.FromFile(_path);

if (im.Width > im.Height)
{
this.Width = 710;
this.Height = 560;
}
else
{
this.Width = 510;
this.Height = 630;
}
im.Dispose();
pbox.Load(_path);
}
}
catch (Exception)
{
}

glyas47
دوشنبه 13 آبان 1398, 09:21 صبح
یه بار قبل از هربار فراخوانی عکسهای جدید این کد رو اجرا کنید و نتیجه رو بگید


GC.Collect();
GC.WaitForPendingFinalizers();

یک مقدار درباره کدها توضیح میدید لطفا

GC چی هست؟

رامین مرادی
دوشنبه 13 آبان 1398, 09:32 صبح
یک مقدار درباره کدها توضیح میدید لطفا

GC چی هست؟

بهتره یه بار این مقاله رو مطالعه کنید
https://programming.tosinso.com/fa/tutorials/32538/%d8%a2%d8%b4%d9%86%d8%a7%db%8c%db%8c-%d8%a8%d8%a7-%da%a9%d9%84%d8%a7%d8%b3-system-gc-%d8%af%d8%b1-%d8%af%d8%a7%d8%aa-%d9%86%d8%aa

GC برای مدیریت حافظه هستش.مقاله رو بخونید کامل درک میکنید.

glyas47
سه شنبه 14 آبان 1398, 07:10 صبح
بهتره یه بار این مقاله رو مطالعه کنید
https://programming.tosinso.com/fa/tutorials/32538/%d8%a2%d8%b4%d9%86%d8%a7%db%8c%db%8c-%d8%a8%d8%a7-%da%a9%d9%84%d8%a7%d8%b3-system-gc-%d8%af%d8%b1-%d8%af%d8%a7%d8%aa-%d9%86%d8%aa

GC برای مدیریت حافظه هستش.مقاله رو بخونید کامل درک میکنید.

بسیار متشکرم:تشویق:

mmbguide
پنج شنبه 30 آبان 1398, 19:49 عصر
پیشنهاد میکنم در زمان دخیره کردن تصاویر حتما یک Thumbnail بسازید و تا زمانی که به خود عکس اصلی کاری ندارید، برای مرور و کارهای متفرقه از Tumbnail های کم حجم استفاده کنید. همچنین در بکارگیری متغیرها اگر امکان داشت حتما متغیر رو Dispose کنید. میتونید از Using هم استفاده کنید(اگر امکان داشت).

the king
شنبه 02 آذر 1398, 15:02 عصر
سلام من یه برنامه شبیه گالری عکس درست کردم که بعد از مشخص کردن پوشه موردنظر ، برنامه عکس های درون آنرا بصورت گالری در پنجره ای پشت هم باز میکند که میتوان بعد از کلیلک روی هر عکس ، بزرگ شده عکس را در پنجره ای داخل برنامه مشاهده کرد ولی زمانیکه 50 یا بیشتر عکس که داخل برنامه بارگزاری میشه دیگه بعد از آن هیچ عکسی داخل picturebox های برنامه نمایش داده نمیشه تا اینکه برنامه را کلا ببندم و دوباره باز کنم که دوباره تا تعدادی عکس نمایش بده .هیچ اروری هم نمیده فقط دیگه نمایش نمیده.

باید چه کنم؟

مثال پیوستی رو ببینید :

151004

اصولی که من در اینجور موارد رعایت می کنم اینهاست :


اگر کاربر در این لحظه باید تصویر شماره 4 رو ببینه، اولویت اینه که با حداکثر سرعت تصویر شماره 4 فراخوانی و نمایش داده بشه. سایر عملیاتی که میخواهیم انجام بدیم باید در اولویت های بعدی قرار بگیرند.
خوبه که چندین عکس رو فراخوانی کنم و در cache نگهدارم ولی هرگز کاربر رو برای فراخوانی تصاویری که الان نمیخواد ببینه معطل نخواهم کرد.
چون معمولا مرور تصاویر به سمت بالا و پایین لیست فایل ها است و پیمایش متوالی است، چند تصویر قبلی و چند تصویر بعدی رو در حافظه cache فراخوانی می کنم تا سرعت نمایش اونها افزایش پیدا کنه.
فراخوانی باید در نخ مجزایی باشه، نه در نخ اصلی برنامه تا برنامه موقع فراخوانی سکته نکنه.
در کار GC دخالت نخواهم کرد، وظیفه من به عنوان برنامه نویس یک زبان سطح بالا مثل #C که مدیریت حافظه خودکار داره اینه که هر زمان که دیدم دیگر نیازی به یک شی Disposable شدنی ندارم، به سادگی Dispose اش کنم، فقط همین.


اینکه حافظه های بلااستفاده مدیریت شده (Managed) در همون لحظه آزاد نمیشه دلایل منطقی داره، بیخودی نیست که GC در آزاد کردنشون عجله نمیکنه.
من به GC درخواست نمیدم که یالا آزادشون کن، دخالت نمی کنم. GC خودش هر زمانی که مفید بدونه حافظه بلااستفاده رو آزاد میکنه تا به سیستم عامل برگردونه.
GC عملکرد بی نقص و فوق العاده ای نداره اما دخالت من هم اونقدر ها که بنظر خودم میاد مفید نیست.



از Image.FromFile استفاده نخواهم کرد، چون روتینش طوریه که فایل رو بعد باز کردن گرو نگه میداره و Lock میشه و کاربر نمیتونه فایلش رو Rename یا Delete یا ... بکنه، حتی وقتی دیگه تصویر رو نمیبینه.


وقتی کاربر تصویری رو روی فرم نمیبینه از دید اون نباید فایلش مشغول باشه. وقتی اطلاعات تصویر رو در حافظه RAM خوندیم اساسا دیگه احتیاجی به فایلش نداریم.
بجای Image.FromFile خودم فایل رو میخونم و Image.FromStream رو بکار می برم تا بعدش فایل رو ببندم.

رامین مرادی
یک شنبه 20 بهمن 1398, 15:12 عصر
مثال پیوستی رو ببینید :

151004

اصولی که من در اینجور موارد رعایت می کنم اینهاست :


اگر کاربر در این لحظه باید تصویر شماره 4 رو ببینه، اولویت اینه که با حداکثر سرعت تصویر شماره 4 فراخوانی و نمایش داده بشه. سایر عملیاتی که میخواهیم انجام بدیم باید در اولویت های بعدی قرار بگیرند.
خوبه که چندین عکس رو فراخوانی کنم و در cache نگهدارم ولی هرگز کاربر رو برای فراخوانی تصاویری که الان نمیخواد ببینه معطل نخواهم کرد.
چون معمولا مرور تصاویر به سمت بالا و پایین لیست فایل ها است و پیمایش متوالی است، چند تصویر قبلی و چند تصویر بعدی رو در حافظه cache فراخوانی می کنم تا سرعت نمایش اونها افزایش پیدا کنه.
فراخوانی باید در نخ مجزایی باشه، نه در نخ اصلی برنامه تا برنامه موقع فراخوانی سکته نکنه.
در کار GC دخالت نخواهم کرد، وظیفه من به عنوان برنامه نویس یک زبان سطح بالا مثل #C که مدیریت حافظه خودکار داره اینه که هر زمان که دیدم دیگر نیازی به یک شی Disposable شدنی ندارم، به سادگی Dispose اش کنم، فقط همین.


اینکه حافظه های بلااستفاده مدیریت شده (Managed) در همون لحظه آزاد نمیشه دلایل منطقی داره، بیخودی نیست که GC در آزاد کردنشون عجله نمیکنه.
من به GC درخواست نمیدم که یالا آزادشون کن، دخالت نمی کنم. GC خودش هر زمانی که مفید بدونه حافظه بلااستفاده رو آزاد میکنه تا به سیستم عامل برگردونه.
GC عملکرد بی نقص و فوق العاده ای نداره اما دخالت من هم اونقدر ها که بنظر خودم میاد مفید نیست.



از Image.FromFile استفاده نخواهم کرد، چون روتینش طوریه که فایل رو بعد باز کردن گرو نگه میداره و Lock میشه و کاربر نمیتونه فایلش رو Rename یا Delete یا ... بکنه، حتی وقتی دیگه تصویر رو نمیبینه.


وقتی کاربر تصویری رو روی فرم نمیبینه از دید اون نباید فایلش مشغول باشه. وقتی اطلاعات تصویر رو در حافظه RAM خوندیم اساسا دیگه احتیاجی به فایلش نداریم.
بجای Image.FromFile خودم فایل رو میخونم و Image.FromStream رو بکار می برم تا بعدش فایل رو ببندم.



متاسفانه فایلتون رو ویروس میشناسه امکانش هست کد هارو بزارید؟ یا فایل اجراییش رو پاک کنید بعد همینجا اپلود کنید؟ممنون

the king
یک شنبه 20 بهمن 1398, 19:54 عصر
متاسفانه فایلتون رو ویروس میشناسه امکانش هست کد هارو بزارید؟ یا فایل اجراییش رو پاک کنید بعد همینجا اپلود کنید؟ممنون
اینم نتیجه بررسی همون فایل با 59 ویروس کش :

No engines detected this file

151348 (https://www.virustotal.com/gui/file/6db94978ab41beb1921ed1532006b11236a47dcb2fc09d0687 c00ad51de48fc9/detection)