[Compact .NET]Réduire la consommation mémoire : outofmemory

Réduire la consommation mémoire : outofmemory [Compact .NET] - Divers - Programmation

Marsh Posté le 28-10-2008 à 14:24:46    

Bonjour,  
 
Je me suis récemment mis au développement sous windows mobile (j'ai déjà de l'expérience en développement vb .net sur pc), et je me retrouve un peu embêté par la gestion de la mémoire windows mobile :s
 
Voila mon code :
 

Code :
  1. Imports System
  2. Imports System.Drawing
  3. Imports System.Windows.Forms
  4. Imports System.Threading
  5. Imports System.Xml
  6. Namespace DodgerCodeSnippets
  7.     ''' <summary>
  8.     ''' Description résumée de FormMain.
  9.     ''' </summary>
  10.     Public Class FormMain
  11.         Inherits System.Windows.Forms.Form
  12.         Private lst As New List(Of String)
  13.         Private offScreenBitmap As Bitmap
  14.         Private offScreenGraphics As Graphics
  15.         ' Représenta la zone dans laquelle on dessine les items
  16.         Private onScreenGraphics As Graphics
  17.         ' Représenta la zone réellement affichée
  18.         Private m_bSelectionDone As Boolean = False
  19.         Private m_iScreenWidth As Integer = 480
  20.         ' Taille de l'écran
  21.         Private m_iScreenHeight As Integer = 588
  22.         Private m_iItemsCount As Integer = Nothing
  23.         ' Nombre d'Item dans la liste
  24.         Private m_iItemheight As Integer = 80
  25.         ' auteur d'un item
  26.         Private m_iStripWidth As Integer = 480
  27.         Private m_iStripHeight As Integer = 588
  28.         ' Hauteur totale de la liste
  29.         Private m_iStripPosY As Integer = 1
  30.         Private m_iOldStripPosY As Integer = -10
  31.         Private m_iMoveStep As Integer = 1
  32.         ' Déplacement en nombre de pixels à chaque boucle
  33.         Private m_iSens As Integer = 0
  34.         ' 0,+1,-1
  35.         Private m_iTouchStartY As Integer = 0
  36.         ' Position en pixel de l'endroit où l'on a posé le doigt
  37.         Private m_iTouchEndY As Integer = 0
  38.         ' Position en pixel de l'endroit où l'on a relevé le doigt
  39.         Private m_iSelectedIndexItem As Integer = -1
  40.         ' Numéro de l'Item sélectionné
  41.         Private m_iPixelPerScroll As Integer = 0
  42.         ' De combien de pixel doit on scrollé après un mouvement de doigt sur l'écran
  43.         Private m_iSleep As Integer = 3
  44.         ' nombre de milliseconde d'attente dans la boucle
  45.         Public Shared OddCellBackGroundColor As System.Drawing.Color = System.Drawing.Color.Transparent
  46.         Public Shared EvenCellBackGroundColor As System.Drawing.Color = System.Drawing.Color.Transparent
  47.         Public Shared SelectedCellBackGroundColor As System.Drawing.Color = System.Drawing.Color.Transparent
  48.         Public Shared CellBorderColor As System.Drawing.Color = System.Drawing.Color.LightGray
  49.         Public Sub New()
  50.             parsexml()
  51.             m_iItemsCount = lst.Count
  52.             InitScreens()
  53.             DoLoop()
  54.         End Sub
  55.         Private Sub InitScreens()
  56.             Me.Visible = True
  57.             Me.WindowState = FormWindowState.Normal
  58.            m_iStripHeight = m_iItemsCount * m_iItemheight
  59.             ' Creation d'un ecran virtuel plus grand que l'écran du PDA qui contient toute la liste
  60.             offScreenBitmap = New Bitmap(m_iStripWidth, m_iStripHeight)
  61.             offScreenGraphics = Graphics.FromImage(offScreenBitmap)
  62.             offScreenGraphics.Clear(Color.Black)
  63.             onScreenGraphics = Me.CreateGraphics()
  64.         End Sub
  65.         Private Sub DoLoop()
  66.             ' C'est ici que l'on dessine les Items
  67.             For iItem As Integer = 0 To m_iItemsCount - 1
  68.                 DrawItem(iItem)
  69.             Next iItem
  70.             onScreenGraphics.Clear(Color.Black)
  71.             onScreenGraphics.DrawImage(offScreenBitmap, 0, 0, New Rectangle(0, 0, 480, 588), GraphicsUnit.Pixel)
  72.             Application.DoEvents()
  73.             Render()
  74.             onScreenGraphics.Dispose()
  75.             Application.DoEvents()
  76.             MessageBox.Show("Vous avez sélectionné l'item : " + m_iSelectedIndexItem, "Info" )
  77.             Application.[Exit]()
  78.         End Sub
  79.         ''' <summary>
  80.         ''' Nettoyage des ressources utilisées.
  81.         ''' </summary>
  82.         Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
  83.             MyBase.Dispose(disposing)
  84.         End Sub
  85.         ''' <summary>
  86.         ''' Point d'entrée principal de l'application.
  87.         ''' </summary>
  88.         Public Shared Sub Main()
  89.             Application.Run(New FormMain())
  90.         End Sub
  91.         ''' <summary>
  92.         ''' Boucle principale de rendu de la liste
  93.         ''' </summary>
  94.         Protected Overridable Sub Render()
  95.             ' distance parcourrue en pixel depuis le dernier mouvement de doigt
  96.             Dim iPixelScrollCount As Integer = 0
  97.             While Not m_bSelectionDone
  98.                 Try
  99.                     ' On bloque le scroll quand on arrive en bas
  100.                     If (m_iSens = 1) AndAlso (m_iStripPosY + m_iScreenHeight >= m_iStripHeight) Then
  101.                         m_iSens = 0
  102.                         iPixelScrollCount = 0
  103.                     End If
  104.                     ' On bloque le scroll quand on arrive en haut
  105.                     If (m_iSens = -1) AndAlso (m_iStripPosY <= 0) Then
  106.                         m_iSens = 0
  107.                         iPixelScrollCount = 0
  108.                     End If
  109.                     If m_iSens <> 0 Then
  110.                         iPixelScrollCount += 1
  111.                         m_iStripPosY += m_iMoveStep * m_iSens
  112.                     End If
  113.                     ' Si on a scrollé du nombre de pixel que l'on souhaitait
  114.                     ' On s'arrete
  115.                     If iPixelScrollCount > m_iPixelPerScroll Then
  116.                         m_iSens = 0
  117.                         iPixelScrollCount = 0
  118.                     End If
  119.                     ' Si on a pas bougé, inutile de re-dessiner
  120.                     If m_iOldStripPosY <> m_iStripPosY Then
  121.                         onScreenGraphics.DrawImage(offScreenBitmap, 0, 0, New Rectangle(0, m_iStripPosY, 480, 588), GraphicsUnit.Pixel)
  122.                         m_iOldStripPosY = m_iStripPosY
  123.                     End If
  124.                     Application.DoEvents()
  125.                     ' On laisse le temps au PDA de souffler
  126.                     ' On ralentit quelque peu le scrolling
  127.                     Thread.Sleep(m_iSleep)
  128.                 Catch exp As Exception
  129.                     MessageBox.Show("Oups il y a un problème dans Render :" + exp.ToString())
  130.                 End Try
  131.             End While
  132.         End Sub
  133.         ''' <summary>
  134.         ''' Dessine un Item ( élément ) de la liste à la position indiquée
  135.         ''' </summary>
  136.         ''' <param name="iIndex"></param>
  137.         Private Sub DrawItem(ByVal iIndex As Integer)
  138.             Dim font As Font
  139.             Dim text As String
  140.             Dim blackBrush As Brush = New SolidBrush(Color.Black)
  141.             Dim brushOdd As Brush = New SolidBrush(OddCellBackGroundColor)
  142.             Dim brushEven As Brush = New SolidBrush(EvenCellBackGroundColor)
  143.             Dim brush As Brush = Nothing
  144.             font = New Font(FontFamily.GenericSansSerif, 5, FontStyle.Bold)
  145.             Dim pen As New Pen(CellBorderColor)
  146.            ' On intervertit les couleurs pour donner un coté sympa
  147.             If (iIndex Mod 2) = 0 Then
  148.                 brush = brushOdd
  149.             Else
  150.                 brush = brushEven
  151.             End If
  152.             offScreenGraphics.FillRectangle(brush, 0, iIndex * m_iItemheight, m_iScreenWidth - 1, m_iItemheight)
  153.             offScreenGraphics.DrawRectangle(pen, 0, iIndex * m_iItemheight, m_iScreenWidth, m_iItemheight)
  154.             ' C'est ici que vous insérez le texte que vous souhaitez
  155.             text = lst.Item(iIndex)
  156.             offScreenGraphics.DrawString(text, font, blackBrush, 10, (iIndex * m_iItemheight) + 10)
  157.         End Sub
  158.         ''' <summary>
  159.         ''' Dessine un Item sélectionné à la position indiquée
  160.         ''' </summary>
  161.         ''' <param name="iIndex"></param>
  162.         Private Sub DrawSelectedItem(ByVal iIndex As Integer)
  163.             Dim text As String
  164.             Dim font As Font
  165.             Dim pen As New Pen(CellBorderColor)
  166.             Dim blackBrush As Brush = New SolidBrush(Color.Black)
  167.             font = New Font(FontFamily.GenericSansSerif, 5, FontStyle.Bold)
  168.             ' On dessine le rectangle plein
  169.             offScreenGraphics.FillRectangle(New SolidBrush(SelectedCellBackGroundColor), 0, iIndex * m_iItemheight, m_iScreenWidth - 1, m_iItemheight)
  170.             ' avec un petit contour gris
  171.             offScreenGraphics.DrawRectangle(pen, 0, iIndex * m_iItemheight, m_iScreenWidth, m_iItemheight)
  172.             text = lst.Item(iIndex)
  173.             ' On affiche le texte
  174.             offScreenGraphics.DrawString(text, font, blackBrush, 10, (iIndex * m_iItemheight) + 10)
  175.             m_iOldStripPosY = -1
  176.             ' Force à redessiner ( voir méthode Render() )
  177.         End Sub
  178.         ' Gestion du scroll au doigt et à l'oeuil ... heu non au stylet !
  179.         Private Sub FormMain_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
  180.             m_iTouchEndY = e.Y
  181.             If m_iSens = 0 Then
  182.                 If m_iTouchStartY - m_iTouchEndY > 0 Then
  183.                     m_iSens = 1
  184.                 Else
  185.                     m_iSens = -1
  186.                 End If
  187.                 Dim iDelta As Integer = Math.Abs(m_iTouchStartY - m_iTouchEndY)
  188.                 ' Plus le doigt a glissé sur une grande distance,
  189.                 ' plus on scroll loin
  190.                 If iDelta > 160 Then
  191.                     m_iPixelPerScroll = 588
  192.                     m_iSleep = 0
  193.                 ElseIf (iDelta > 100) AndAlso (iDelta < 160) Then
  194.                     m_iPixelPerScroll = 294
  195.                     m_iSleep = 2
  196.                 ElseIf (iDelta < 100) AndAlso (iDelta > 20) Then
  197.                     m_iPixelPerScroll = 147
  198.                     m_iSleep = 4
  199.                 Else
  200.                     ' On commence par effacer le précédent item sélectionné si il existe
  201.                     Dim iPreviousSelectionIndex As Integer = m_iSelectedIndexItem
  202.                     If m_iSelectedIndexItem > -1 Then
  203.                         DrawItem(iPreviousSelectionIndex)
  204.                     End If
  205.                     m_iSens = 0
  206.                     m_iSelectedIndexItem = (m_iStripPosY + m_iTouchEndY) / m_iItemheight
  207.                     DrawSelectedItem(m_iSelectedIndexItem)
  208.                     If iPreviousSelectionIndex = m_iSelectedIndexItem Then
  209.                         m_bSelectionDone = True
  210.                     End If
  211.                 End If
  212.                 m_iTouchStartY = 0
  213.                 m_iTouchEndY = 0
  214.             Else
  215.                 ' si on touche l'écran pendant le scroll, ça l'arrete
  216.                 m_iSens = 0
  217.             End If
  218.         End Sub
  219.         Private Sub FormMain_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
  220.             m_iTouchStartY = e.Y
  221.         End Sub
  222.         Private Sub InitializeComponent()
  223.             Me.SuspendLayout()
  224.             '
  225.             'FormMain
  226.             '
  227.             Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit
  228.             Me.ClientSize = New System.Drawing.Size(480, 588)
  229.             Me.Location = New System.Drawing.Point(0, 52)
  230.             Me.Name = "FormMain"
  231.             Me.Text = "iListBox"
  232.             Me.ResumeLayout(False)
  233.         End Sub
  234.         Public Function parsexml() As String
  235.             Dim m_xmlr As XmlTextReader
  236.             'Create the XML Reader
  237.             m_xmlr = New XmlTextReader("http://yp.shoutcast.com/sbin/newxml.phtml" )
  238.             'Disable whitespace so that you don't have to read over whitespaces
  239.             m_xmlr.WhitespaceHandling = WhitespaceHandling.None
  240.             'read the xml declaration and advance to family tag
  241.             m_xmlr.Read()
  242.             'read the family tag
  243.             m_xmlr.Read()
  244.             'Load the Loop
  245.             While Not m_xmlr.EOF
  246.                 'Go to the name tag
  247.                 m_xmlr.Read()
  248.                 'if not start element exit while loop
  249.                 If Not m_xmlr.IsStartElement() Then
  250.                     Exit While
  251.                 End If
  252.                 'Get the Gender Attribute Value
  253.                 Dim nameAttribute As String = m_xmlr.GetAttribute("name" )
  254.                 'Read elements firstname and lastname
  255.                 m_xmlr.Read()
  256.                 lst.Add(nameAttribute)
  257.             End While
  258.             'close the reader
  259.             m_xmlr.Close()
  260.         End Function
  261.     End Class
  262. End Namespace


 
Ici la taille de l'item dans ma listbox est de 80px, le nombre d'item était, au moment du test, de 386, sois un écran virtuel de 30880 * 480 pixels (voir ligne en rouge dans le code). Ça semble être un peu lourd à gérer pour wm6 qui, si j'ai bien compris, ne supporte que des process de 32mo.
 
Ma listbox s'affiche parfaitement si je prends 10 comme taille d'item, le problème est que c'est beaucoup trop petit pour être utilisé au doigt, les items étant plus petit que ceux de la listbox d'origine :p
 
Comment réduire cette consommation de mémoire ou partager en plusieurs processus ce bout de code ?
 
Merci d'avance :D

Reply

Marsh Posté le 28-10-2008 à 14:24:46   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed