PDA

View Full Version : حرفه ای: جلوگیری از افزایش مقدار RAM برنامه



محسن واژدی
شنبه 30 بهمن 1389, 22:28 عصر
سلام علیکم
چطور بعضي از برنامه ها فضاي Ram رو زياد ميگيرن مثلا 30مگ ولي يکدفعه مياي ميبيني شده 2 مگ، 1 مگ در بعضي جاها هم ميبينم که فضاشون مياد در حد 100، 200 کيلو بايت
شايد باور نکنين اما يکي از فايل هاي برنامه snagit رو ديدم که فضاش 0 کيلو بايت شده بود

آيا بنده ميتونم در برنامه هام دستوري به اين منظور قرار بدم که وقتي برنامه ام فضاي زيادي از رم رو گرفت با اجرا کردنش فضا را کاهش دهد
آيا از API استفاده ميشه
apiهایی نظیر GlobalAlloc و ...؟
البته میدونم هر چه حجم محتوی اعلان ها بیشتر باشه و یا هرچه قدر شی بیشتری در حافظه تعریف شود در مقدار حافظه تاثیر گذار خواهد بود

در کل چه کارهايي هم براي کاهش فضاي رم برام پيشنهاد ميکنين

اگه ممکنه با سورس يا يک نمونه کد توضيح بدين

باتشکر

returnx
شنبه 30 بهمن 1389, 22:54 عصر
یکی از مهم ترین عوامل برای کاهش فضای رم استفاده نکردن از متغیر های عمومی است چون متغیر های عمومی از ابتدا تا انتهای برنامه وجود دارند و زمانی که بهشون نیازی نیست فضا را آزاد نمی کنند و در اختیار دارند...

محسن واژدی
شنبه 30 بهمن 1389, 23:34 عصر
ممنون از توجهتون بنده میخواستم با apiها اینکار رو انجام بدم

returnx
یک شنبه 01 اسفند 1389, 00:04 صبح
QUOTE=mohsenvj;1216524]ممنون از توجهتون بنده میخواستم با apiها اینکار رو انجام بدم[/QUOTE]
فکر کنم با GlobalFree میشه یک کار هایی کرد..
توضیحات این تابع تو Api-Guide :

The GlobalFree function frees the specified global memory object and invalidates its handle.
اگه خواستید Example شم می تونم براتون بزارم (من که چیزی ازش نفهمیدم)

محسن واژدی
یک شنبه 01 اسفند 1389, 08:22 صبح
ممنون از توجهتون بنده میخواستم با apiها اینکار رو انجام بدم
فکر کنم با GlobalFree میشه یک کار هایی کرد..
توضیحات این تابع تو Api-Guide :

اگه خواستید Example شم می تونم براتون بزارم (من که چیزی ازش نفهمیدم)

ممنون، در APIGuide هم دیدم
اگه به نمونه موجود در طبقه memoryیش توجه کرده باشین از یکی از apiهای مربوط به کنترل memory (فکر کنم اسمش GlobalAlloc بود) memory را از مقدار حجیمی از داده ها انباشته میکرد بصورتیکه اگر فضای اولیه 1 مگ بود میشد 200، 300 مگ و بعدش با GlobalFree اونو خالی میکرد و مجددا میشد همون 1مگ اولیه
اما اینطور که معلوم بود این فقط برای زمانی بود که با api مموری اشغال شده نه با خود برنامه به همین دلیل این نمونه API-Guide هم کمکی به بنده نکرد به همین خاطر درخواست داشتم اگر میشود بگونه ای با این apiها برای خود مموری اشغال شده توسط برنامه هم کاری کرد بیان کنند
موفق باشید

vbhamed
یک شنبه 01 اسفند 1389, 15:26 عصر
سلام

نيازي نيست در ويژوال بيسيك با API حافظه رو آزاد كنيد
اگر آرايه اي دايناميك تعريف كردين بعد از استفاده بعدش رو 0 كنيد
فرمهايي كه نياز نداريد رو هم Unload كنيد و بعدش حتما دستور نمونه زير رو مثلا براي Form1 بنويسيد

set form1 = Nothing

محسن واژدی
یک شنبه 01 اسفند 1389, 16:30 عصر
سلام

نيازي نيست در ويژوال بيسيك با API حافظه رو آزاد كنيد
اگر آرايه اي دايناميك تعريف كردين بعد از استفاده بعدش رو 0 كنيد
فرمهايي كه نياز نداريد رو هم Unload كنيد و بعدش حتما دستور نمونه زير رو مثلا براي Form1 بنويسيد

set form1 = Nothing

خیلی ممنون قبلا از این موارد اطلاع داشتم؛
در مورد آرایه ها درست اما در مورد فرم، قبلا هم از set استفاده میکردم اما محتوی متغیرهای اعلان شده ای که در سطح عمومی اما در ماژول فرم وجود داشتند هم با اجرای دستور Set از رم خارج میشدند که من اینو نمیخواستم البته از طرفی بنابه دلایلی نمیتوانستم اونا رو در ماژول عمومی هم تعریف کنم از این جهت به دنبال راهی برای این کار توسط apiها میگردم
با تشکر از همگی

vbhamed
شنبه 07 اسفند 1389, 11:50 صبح
سلام

خب ايني كه شما مي خواين كه تناقض داره
وقتي فرم رو Unload مي كنيد همه حافظه مصرفي فرم آزاد ميشه به غير از متغيرهاي معمولي و آرايه اي عمومي فرم
اون رو هم ميشه با Set ... = Nothing آزاد كرد
حالا پس شما با API ديگه چي رو مي خواين آزاد كنيد، فرمي كه حافظش آزاد هست رو دوباره مي خواين آزاد كنيد !

محسن واژدی
شنبه 07 اسفند 1389, 12:46 عصر
سلام

خب ايني كه شما مي خواين كه تناقض داره
وقتي فرم رو Unload مي كنيد همه حافظه مصرفي فرم آزاد ميشه به غير از متغيرهاي معمولي و آرايه اي عمومي فرم


سلام
اگر دیده باشید متغیر هایی که در ماژول فرم بصورت عمومی هم اعلان شده باشند به هنگام Nothing کردن فرم آزاد میشوند به عبارتی به همراه فرم به عنوان یک حافظه مصرفی که متعلق به فرم بوده از حافظه حذف میشوند که بنده اینگونه نمیخواستم
البته ممنون از توجهتون، مشکله رو یه کاریش کردم
موفق باشید

vbhamed
شنبه 07 اسفند 1389, 14:59 عصر
سلام

فكر نكنم متوجه منظور من نشدين
شما 2 تا حافظه مصرفي داريد

1 - حافظه فرم و اشياء و ...
2 - حافظه متغيرهاي عمومي فرم

اوليش با Unload آزاد ميشه، دوميش با Nothing
دلخواه هم هست كه حافظه متغيرهاي عمومي رو آزاد كنيم يا نكنيم

حالا API اين وسط چيكارست ؟

محسن واژدی
دوشنبه 09 اسفند 1389, 22:51 عصر
حالا API اين وسط چيكارست ؟
اینی که بنده عرض کردم با api، چون در برنامه API-Guide با دستورات GlobalAlloc (البته دقیقا دستورش رو یادم نیست) و نظیر اینها که با رم سرکار داشتند یه نمونه داشت که حافظه 4 مگی رم رو تا 130 مگ افزایش میداد و سپس سریعا اون 130 مگه رو خالی میکرد و مجددا" میشد 4 مگ
و همین هم برای بنده سوالی ایجاد کرده بود که آیا ممکنه با api بتوانیم حافظه رم مورد استفاده برنامه را کاهش داد
و اینکه گفتین باید فرم را Unload کرد و یا متغیر ها و آرایه ها را nothing کرد، بنده با همه اینها امتحان کرده ام اما جواب نداد به عنوان مثال وقتی که فرمی را باز میکنیم تقریبا 2 مگ از رم را اشغال میکنه اما وقتی که اونو unload و حتی nothing میکردم اون مقدار فضایی که به هنگام لود شدن فرم به رم افزوده میشد مجددا کم نمیشد

موفق باشید

vbhamed
سه شنبه 10 اسفند 1389, 00:49 صبح
سلام

اين يك نمونه اختصاص حافظه دايناميك كه بعدش آزاد ميشه


Dim x() As Byte

ReDim x(130000000) As Byte
'Free Memory
ReDim x(0)


در مورد فرمها هم حتما مشكي تو برنامتون هست كه آزاد نشده، بالاخره هنوز چيزي در حال استفاده هست