منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
المساعده في الخطاء out of memory - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم اسئلة VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=183)
+--- الموضوع : المساعده في الخطاء out of memory (/showthread.php?tid=22525)

الصفحات: 1 2


المساعده في الخطاء out of memory - Rabeea Qbaha - 13-11-17

مرحبا شباب 
عندي مشكله صغيره يا ريت افاده او اقتراحات لحلها
بعد ما انتهيت تقربا من البرامج الخاص في 
اواجه مشكله وهي انه بعد ترك البرنامج لفتره معينه لنقل 5 دقائق و اكثر 
تبدا الواجه interface بالاختفاء مثل : buttons ,labels  ... etc 
و يظهر لي خطا كالاتي : out of memory

انا استخدم custom controls وهي : Bunifu_UI_v1.5.3

لكن استخدم اشياء بسيطه منها وهي ال datagridview و datetimepicker 

لكن لا اعتقد ان المشكله منها لان كل شيء حتى الكونترول الاصليه من visual studio يحصل فيها هذا الشيء
فرجائا افيدوني ، وشكرا.

البرنامج قبل :


البرنامج بعد :


رساله الخطاء :


وهذه رساله الخطاء بالتفصيل :

كود :
System.OutOfMemoryException was unhandled
 HResult=-2147024882
 Message=Out of memory.
 StackTrace:
      at System.Drawing.Graphics.FromHdcInternal(IntPtr hdc)
      at System.Windows.Forms.ComboBox.WmReflectDrawItem(Message& m)
      at System.Windows.Forms.ComboBox.WndProc(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
      at System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
      at System.Windows.Forms.Control.SendMessage(Int32 msg, IntPtr wparam, IntPtr lparam)
      at System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWnd, Message& m)
      at System.Windows.Forms.Control.WmOwnerDraw(Message& m)
      at System.Windows.Forms.Control.WmDrawItem(Message& m)
      at System.Windows.Forms.Control.WndProc(Message& m)
      at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
      at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
      at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
      at System.Windows.Forms.Control.DefWndProc(Message& m)
      at System.Windows.Forms.Control.WmSetFocus(Message& m)
      at System.Windows.Forms.Control.WndProc(Message& m)
      at System.Windows.Forms.ComboBox.WndProc(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
 InnerException:




RE: المساعده في الخطاء out of memory - Rabeea Qbaha - 13-11-17

تم حل المشكله بنجاح 
لكي يستفيد الاخرين :

المشكله كانت هي انني اقوم باستدعاء صوره جديده كل مره اقوم بالدخول الى buttons 
ولا يتم عمل dispose لها.

بالشكل الاتي :

كود :
Private Sub close_butt_MouseEnter(sender As Object, e As EventArgs) Handles close_butt.MouseEnter
   close_butt.Image = My.Resources.Close_white_32
   close_butt.BackColor = Color.Red
End Sub
Private Sub close_butt_MouseLeave(sender As Object, e As EventArgs) Handles close_butt.MouseLeave
   close_butt.Image = My.Resources.Close_white_32
   close_butt.BackColor = Nothing
End Sub


وكان الحل هو بعمل مصفوفه لجميع الصور التي احتاجها من ال resources و استدعائها مره واحده فقط على هذا الشكل :


كود :
   Private BGImgs As Image()
  
وفي load event :
كود :
BGImgs = New Image() {
                       My.Resources.customers_1,
                       My.Resources.customers,
                       My.Resources.Stores_1,
                       My.Resources.Stores,
                       My.Resources.contract_1,
                       My.Resources.contract,
                       My.Resources.payments_1,
                       My.Resources.Payments,
                       My.Resources.Cheque,
                       My.Resources.Cheque_shadow,
                       My.Resources.Employees,
                       My.Resources.Employees_shadow,
                       My.Resources.Expenses,
                       My.Resources.Expenses_shadow
                     }

ويتم أستخدام الصور بعد ذلك بهذه الطريقة :

كود :
Private Sub customers_but_MouseEnter(sender As Object, e As EventArgs) Handles customers_but.MouseEnter
       customers_but.Image = BGImgs(0)
       Customers_Panel.Visible = True
   End Sub
   Private Sub customers_but_MouseLeave(sender As Object, e As EventArgs) Handles customers_but.MouseLeave
       customers_but.Image = BGImgs(1)
       Customers_Panel.Visible = False
   End Sub



RE: المساعده في الخطاء out of memory - silverlight - 13-11-17

ملحوظة صغيرة

تخصيص الصورة من Resources مثل تخصيص الصورة من مصفوفة
و في كلتا الحالتين فإن الكود الذي كتبته و تعتبره حلا للمشكلة لا يقوم بعمل Dispose للصورة
والخطأ هو خطأ تراكمي يحدث في عملية رسم الكونترول
تقريبا نفس الخطأ يحدث في محموعة من الكونترول موجودة علي نفس الفورم أو علي نفس البانل تقريبا


RE: المساعده في الخطاء out of memory - Rabeea Qbaha - 13-11-17

(13-11-17, 09:38 AM)silverlight كتب : ملحوظة صغيرة

تخصيص الصورة من Resources مثل تخصيص الصورة من مصفوفة
و في كلتا الحالتين فإن الكود الذي كتبته و تعتبره حلا للمشكلة لا يقوم بعمل Dispose للصورة
والخطأ هو خطأ تراكمي يحدث في عملية رسم الكونترول
تقريبا نفس الخطأ يحدث في محموعة من الكونترول موجودة علي نفس الفورم أو علي نفس البانل تقريبا

شكرا على مداخلتك صديقي، أذا ما افضل حل حسب رايك لاستخدام الصور ؟؟
أفدني


RE: المساعده في الخطاء out of memory - silverlight - 14-11-17

أي ملفات يتم توظيفها في المشروع عن طريق اضافتها الي Resources المشروع لا يمكن أن تتخلص منها بنفسك بسهولة كما تعتقد
لكن المشروع نفسه يتكفل بالتخلص منها عندما ينتهي من العمل و يتم اغلاق المشروع

دعي أوضح لك أكثر باستخدام مثال تجريبي

افتخ مشروع و اضف للفورم عدد واحد بكتشر بوكس
ثم اضف اي صورة بحجم مناسب الي Resources المشروع
طبعا الأفضل أنك تجعل Build Action الخاص بالصورة من النوع Embeded Resources
ولكي تفعل ذلك من داخل الفيجوال استوديو عليك تنفيذ التالي
تقف علي ملف الصورة الموجود في الريسورس
وتضغط يمين الماوس وهنا ستظهر لك قائمة جانبية منسدلة
أختار منها أخر أختيار وهو بعنوان Properties
المفروض هنا سيظهر لك في Solution Explorer شئ مثل Grid
منه اضبط Build Action فقط

ثم في الحدث laod الخاص بالفورم اكتب الكود التالي
دعتي افترض ان إسم الصورة التي تم اضافتها للريسورس هو dest.jpg

PHP كود :
  Private Sub Form1_Load(sender As ObjectAs EventArgsHandles MyBase.Load
        Dim bmp 
As Bitmap CType(My.Resources.ResourceManager.GetObject("dest"), Bitmap)
 
       If bmp IsNot Nothing Then
            PictureBox1
.Image bmp
        End 
If

 
       If bmp IsNot Nothing Then
            bmp
.Dispose()
 
           bmp Nothing
        End 
If

 
   End Sub 

أو يمكنك كتابة الكود بالشكل التالي

PHP كود :
   Private Sub Form1_Load(sender As ObjectAs EventArgsHandles MyBase.Load
        Using img 
As Bitmap CType(My.Resources.destBitmap)
 
           If img IsNot Nothing Then
                PictureBox1
.Image img
            End 
If
 
       End Using
    End Sub 

الأن عليك تجربة الكود فقط قم بتتشغيل المشروع و لاحظ ماذا سيحدث معك
ستلاخظ أنه حدث خطأ أثناء التشغيل لأننا نقوم بعمل Dispose للصورة الموجودة في الريسورس

الأن عليك التعديل علي الكود و كتابته بالشكل التالي

PHP كود :
   Private Sub Form1_Load(sender As ObjectAs EventArgsHandles MyBase.Load
        Dim img 
As Bitmap CType(My.Resources.destBitmap)
 
       If img IsNot Nothing Then
            PictureBox1
.Image img
        End 
If
 
   End Sub 

لاحظ أننا لم نقوم بعمل Dispsoe للصورة من خلال الكود
ستلاحظ هنا أن البرنامج سيعمل بشكل صحيح
لأن عملية تمرير البيانات الي البكتشر بوكس تمت بشكل صحيح

لكن لو فعلا تريد عمل Dispose للصورة بشكل صحيح يجب أن تتعامل مع الصورة الموجودة في الريسورس بشكل أخر
والفكرة تنحصر إنك تحتاج الي الحصول علي Reference للصورة وهذا موضوع يطول شرحه قليلا

مثال توضيحي للعلم فقط
مثلا اضف الكود التالي للحدث Paint الخاص بالفورم أو اكتبه بالشكلل التالي

PHP كود :
   Protected Overrides Sub OnPaint(As PaintEventArgs)
 
       MyBase.OnPaint(e)
 
       Using bmp As Bitmap CType(My.Resources.ResourceManager.GetObject("dest"), Bitmap)
 
           e.Graphics.DrawImage(bmp00)
 
       End Using

    End Sub 

ستلاحظ وبالرغم أننا نقوم بعمل Dispose للصورة ستجد أن الصورة يتم رسمها بالفعل علي الفورم بدون أخطاء

ولكي لا أطيل عليك أكثر من ذلك
أرجو أن يكون التالي واضحا لك
الكونترول مصصم أنه و عندما يكون هناك صورة تم تمريرها بواسطة المبرمج فهنا يقوم الكونترول برسم اتلك الصورة في الحدث Paint الخاص بالكونترول
وعندما لا يجد الصورة فهنا يحدث الخطأ

شئ اخير وخاص بالكود الذي أنت استخدمته
ما فعلته أنت هو أنك أخذت نسخة من الصور الموجودة في الريسورس
لكن يظل عليك التخلص من ماهو موجود بالمصفوفة من صور عند اغلاق الفورم
أيضا ربما يكون غير مضمون تماما ما فعلته لأنك لا تضمن متي سييقوم نظأم التشغيل بالتخلص من المصفوفة نفسها كلها
من أجل ذلك فإن الكود الخاص بالمصفوفة يحتاج لتعديل قليلا


و عذرا علي الإطالة .........


RE: المساعده في الخطاء out of memory - Rabeea Qbaha - 14-11-17

شكرا جزيلا اخي silverlight

للاسف بعد الكثير من التعديلات و التخلص من ال picture box و استخدام 2 panels لكل زر بدل تبديل الصور في  picture box
لازلت اواجه نفس المشكله out of memory ، عملت على المشروع لاكثر من 4 شهور و انا الان قريب جدا من وقت التسليم 
ولا اعرق ما الحل لهذه المصيبه هل بامكانك المساعده ؟؟
استطيع ارسال كامل المشروع لك اذا كان لديك الوقت للمساعده.


RE: المساعده في الخطاء out of memory - silverlight - 14-11-17

ارفع المشروع هنا و سأحاول المساعدة بقدر المستطاع


RE: المساعده في الخطاء out of memory - Rabeea Qbaha - 14-11-17

(14-11-17, 11:54 PM)silverlight كتب : ارفع المشروع هنا و سأحاول المساعدة بقدر المستطاع

هل استطيع ان ارسله لك على الخاص ؟؟
لان المشروع للعميل وليس لدي موافقه العميل للنشر.


RE: المساعده في الخطاء out of memory - silverlight - 15-11-17

خاول تعزل المشكلة فقط
مش لازم ترفع الداتابيز و أكواد الداتبيز

انا عايز الصور و الكونتورل اللي بتخلق المشكلة و بس

قبل ما ترفع الملف حاول توضح المعلومات التالية
نسخة FrameWork التي تستخدمها
نسخة الفيجوال استوديو
نسخة الويندوز

لأن المشكلة أحيانا قد يكون سببها Bug في  System drawing
خصوصا في نسخة 2012 و نسخة Framwork 3.5

و ربما هنا قد يكون حل مشكلتك في تحديث Framwork


RE: المساعده في الخطاء out of memory - Rabeea Qbaha - 15-11-17

FrameWork = 4.5
نسخة الفيجوال استوديو = 2015
نسخة الويندوز = windows 10 pro

قمت بفصل الاتصال من قاعده البيانات 
وقنت برفع المشروع على Dropbox 
لكن كيف استطيع ارسال الرابط لك صديقي؟ 
صدقا لا استطيع نشر source code  فهو أمانه 
و انا اعمل مقابل المال للعميل ولا اتوقع انه سيقبل بنشره 
وشكرا.