تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
المساعده في الخطاء out of memory
#13
البرتامج ضخم و و محتاج مراجعة كاملة للكود
عموما  ...... في الفورم Main حاول تغير الاسم الي MainForm
وفي نفس الفورم
عليك مثلا أن لا تقوم بتحمبل الصور من الريسورس في الخدث load
لكن الأفضل أن يكون لديك شئ مثل هذا الكود 

PHP كود :
   Private ReadOnly Property Images As IEnumerable(Of Bitmap)
 
       Get
            Dim result 
As IEnumerable(Of Bitmap) = Nothing
            If result Is Nothing Then
                Dim images 
As List(Of Bitmap) = New List(Of Bitmap)()
 
               images.Add(My.Resources.minimize_white_32'0
                images.Add(My.Resources.server_connection_blue_64) ' 
1

                result 
images.ToList
            End 
If
 
           Return result
        End Get
    End Property 

ايضا عليك تغيير الروتين SetPicture ليكون كالتالي

PHP كود :
   Private Sub SetPicture(ByVal imgSrc As BitmapByRef target As PictureBox)
 
       Using imgDest As Bitmap = New Bitmap(target.ClientSize.Widthtarget.ClientSize.Height)
 
           Dim source_aspectdest_aspectk_aspectAs Double
            source_aspect 
imgSrc.Width imgSrc.Height
            dest_aspect 
imgDest.Width imgSrc.Height
            k_aspect 
dest_aspect source_aspect
            If 
(k_aspect 1Then
                K 
imgSrc.Height imgDest.Height
            Else
                K 
imgSrc.Width imgDest.Width
            End 
If
 
           Dim x_newy_neww_newh_new As Integer
            w_new 
CInt(imgSrc.Width K)
 
           h_new CInt(imgSrc.Height K)
 
           x_new CInt(imgDest.Width w_new 2)
 
           y_new CInt(imgDest.Height h_new 2)
 
           Using g As Graphics Graphics.FromImage(imgDest)
 
               g.InterpolationMode Drawing2D.InterpolationMode.HighQualityBicubic
                g
.DrawImage(imgSrc, New Rectangle(x_newy_neww_newh_new))
 
           End Using
            target
.Image imgDest

        End Using

    End Sub 

يوجد Flicker أو اهنزاز
يحدث عند تحريك الفورم ونفس الشئ يحدث عند تحريك أي فورم أخر
اضبط الخاصية BackgroundBuffer لكل فورم و اجعلها True 

بشكل عام انت تستخدم صور كثيرة كخلفية و يمكنك أن توفر وقتا ضخما و تقلل من الكود الخاص بكل Panel بحيث انه يتم تصميمها لوحدها باستخدام الوراثة

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

دي ملاحظاتي
لكن المشروع محتاج إعادة نظر خصوصا قيما يخص الجرافكس

الكلاس التالي هدية لك و يمكنك ان تستخدمه مع الريسورس بدون أن يحدث مشاكل في عملية Dispose
PHP كود :
Imports System.Runtime.InteropServices

Public Class ImageBuffer
    Implements IDisposable

    Private _handle 
As IntPtr
    Private _source 
As Bitmap
    Private _valid 
As Integer

    Public Sub 
New(source As Bitmap)
 
       Me._source source
        Me
._valid = If(Not source Is Nothing10)
 
       Me.Assign()
 
   End Sub

    Public ReadOnly Property Valid
() As Boolean
        Get
            Return 
(Me._handle <> IntPtr.ZeroAndAlso (Not _valid)
 
       End Get
    End Property

    Public ReadOnly Property Handle 
As IntPtr
        Get
            Return Me
._handle
        End Get
    End Property

    Public Sub Dispose
()
 
       Me.Release()
 
       If Me._source IsNot Nothing Then
            Me
._source.Dispose()
 
           Me._source Nothing
        End 
If
 
   End Sub

    Private Sub Assign
()
 
       If Me._valid Then
            Me
.Assign(Me._source)
 
       End If
 
   End Sub

    Private Sub Assign
(source As Bitmap)
 
       If source IsNot Nothing Then
            Me
.Release()
 
           Me._handle source.GetHbitmap
        End 
If
 
   End Sub

    Private Sub IDisposable_Dispose
() Implements IDisposable.Dispose
        Me
.Dispose()
 
   End Sub

    Private Sub Release
()
 
       If Not _handle.Equals(IntPtr.ZeroThen
            Me
._handle = New IntPtr(0)
 
           Marshal.FreeHGlobal(Me._handle)
 
       End If
 
   End Sub

End 
Class 

الكود التالي يوضح كيفية استخدام الكلاس مع ملف صور موجود في الريسورس 
أو مع صورة من ملف


PHP كود :
       Using buffer As ImageBuffer = New ImageBuffer(CType(My.Resources.destBitmap))
 
           If buffer.Valid Then
                PictureBox1
.Image Image.FromHbitmap(buffer.Handle)
 
           End If
 
       End Using 

PHP كود :
       Using buffer As ImageBuffer = New ImageBuffer(New Bitmap(".\dest.jpg"))
 
           If buffer.Valid Then
                PictureBox1
.Image Image.FromHbitmap(buffer.Handle)
 
           End If
 
       End Using 
Retired
الرد }}}
تم الشكر بواسطة: Rabeea Qbaha


الردود في هذا الموضوع
RE: المساعده في الخطاء out of memory - بواسطة silverlight - 15-11-17, 03:50 AM


التنقل السريع :


يقوم بقرائة الموضوع: