熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

.Net程序開發中一個較為隱蔽的GDI洩露探析收藏

2013-11-15 12:53:06  來源: ASP編程 

  最近一直在調試第三方委托開發的醫療輸液系統(我接手時代碼已經完成原則上我只修改接口部分以適應我們的硬件即可不過調試過程中該程序本身問題暴露不少)該系統用開發該軟件的圖形界面是花費n多銀子專門做的美工大量的貼圖就是目前的主流PC機配置也很難在調試模式下走順溜
 
  問題出在兩方面第一存在內存洩露(有時間我專門為此寫篇文章)第二存在GDI洩露
 
  最早的時候由於存在內存洩露問題我一直以為windows彈出的GDI一般性錯誤是由於內存洩露引起的直到內存問題得以解決程序還是運行一段時間就彈出類似錯誤查了很多資料發現windows任務管理器可以查看GDI是否洩露
 
  發現該程序的GDI對象計數猛漲由於沒有很好的GDI檢查工具和方法(如果這方面有高手希望不吝指教)所以我對程序中大段大段涉及GDI的代碼進行屏蔽然後再檢查是否GDI有洩露n次重復後功夫不負有心人終於鎖定罪魁禍首相關代碼如下
 
   Select Case (uPumpDataPumpName & )Trim

  Case ******

  IRBDetailIcon = IconFromHandle(CType(ImgTabPageImages() Bitmap)GetHicon)

  Case XXXXXX

  IRBDetailIcon = IconFromHandle(CType(ImgTabPageImages() Bitmap)GetHicon)

  Case Else

  IRBDetailIcon = Nothing

  End Select

  問題就出在 IconFromHandle(CType(ImgTabPageImages() Bitmap)GetHicon)這句代碼上msdn在關鍵時刻不辱使命一查結果真相大白  

  IconFromHandle 方法

  從圖標的指定 Windows 句柄 (HICON) 創建 GDI+ Icon

  命名空間:SystemDrawing
程序集:SystemDrawing(在 systemdrawingdll 中)

  Visual Basic(聲明)
 
Public Shared Function FromHandle (handle As IntPtr ) As Icon
 

  Visual Basic(用法)
 
Dim handle As IntPtr

  Dim returnValue As Icon

  returnValue = IconFromHandle(handle)
 

  參數

  handle 圖標的 Windows 句柄

  返回值

  此方法創建的 Icon

  備注

  使用此方法時必須使用 Win API 中的 DestroyIcon 方法釋放產生的圖標以確保釋放相應資源

  示例

  下面的代碼示例設計用於 Windows 窗體它需要 PaintEventArgse(這是 Paint 事件處理程序的參數)代碼執行下列操作

  ·                   創建一個 Bitmap

  ·                   將該對象繪制到屏幕

  ·                   獲取 Bitmap 的圖標句柄

  ·                   將窗體的 FormIcon 屬性設置為從該句柄創建的圖標

  ·                   調用 Win API 函數 DestroyIcon 以釋放資源

  _

  Private Shared Function DestroyIcon(ByVal handle As IntPtr) As Boolean

  End Function

  Private Sub GetHicon_Example(ByVal e As PaintEventArgs)

   Create a Bitmap object from an image file

  Dim myBitmap As New Bitmap(c:\FakePhotojpg)

   Draw myBitmap to the screen

  eGraphicsDrawImage(myBitmap )

   Get an Hicon for myBitmap

  Dim HIcon As IntPtr = myBitmapGetHicon()

   Create a new icon from the handle

  Dim newIcon as Icon = SystemDrawingIconFromHandle(HIcon)

   Set the form Icon attribute to the new icon

  MeIcon = newIcon

   Destroy the icon since the form creates its

   own copy of the icon

  DestroyIcon(newIconHandle)       

  End Sub

  注意備注很關鍵要用API DestroyIcon釋放相關對象

  我聲明了一個API函數

  Public Declare Function DestroyIcon Lib user Alias DestroyIcon (ByVal hIcon As Integer) As Integer

  在IRBDetailIcon的屬性代碼中添加了如下代碼問題立馬解決(當然類銷毀的代碼中

  m_Icon也要釋放一下)

  Public Property Icon() As Icon

  Get

  Return m_Icon

  End Get

  Set(ByVal Value As Icon)

  葉帆

  If Not IsNothing(m_Icon) Then

  DestroyIcon(m_IconHandle)

  m_IconDispose()

  m_Icon = Nothing

  End If

  m_Icon = Value

  MeInvalidate()

  End Set

  End Property

  千裡之堤潰於蟻穴幾萬行的代碼就壞在這一點上實在值得人警惕!


From:http://tw.wingwit.com/Article/program/ASP/201311/21817.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.