リソース開放?

解決


初心者  2009-02-19 10:40:21  No: 141543

VB2008で、GetPixelでカーソル位置の色を取得してPictureBoxに色を表示する簡単なプログラムを作成しました。
今までリソースだのメモリなどあまり気にせず書いてたのですが、リソースが溜まってるせいか
タスクマネージャのメモリ使用量が上がり続けてる事に気になり始めました。
しかも今回のGetPixelではエラーまで発生してしまったので質問させて頂きます。

Imports System.Runtime.InteropServices

Public Class Form1

    <DllImport("gdi32")> Private Shared Function GetPixel(ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer) As Integer
    End Function
    <DllImport("user32")> Private Shared Function GetDC(ByVal hwnd As Integer) As Integer
    End Function

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'GetPixelで色を取得
        Dim GetColor As Color = Color.FromArgb(GetPixel(GetDC(0), Cursor.Position.X, Cursor.Position.Y))
        'PictureBox1に取得した色を表示
        PictureBox1.BackColor = Color.FromArgb(&HFF, GetColor.B, GetColor.G, GetColor.R)
        '左クリックした時にTimer1無効
        If Control.MouseButtons = MouseButtons.Left Then Timer1.Enabled = False
    End Sub

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Enabled = True 'Timer1有効
    End Sub

End Class

以上のコードでTimar1を走らせると、タスクマネージャのメモリ使用量が約30KB/sペースで上がり続け
最初メモリ使用量が22M程度だったのが放置してると29M程度になり、ここでエラーが発生します。
内容は、OutOfMemoryExceptionはハンドルされませんでした。メモリが不足してます。です。
リソースの開放には、Usingステートメントが便利そうなのですが、使い方が解りません。
PictureBoxに対してDisposeしてみたりもしましたが、効果が見られませんでした。
リソースを旨く開放しつつメモリ使用量が上がらないプログラムにするにはどうしたら良いでしょうか?
どうぞ宜しくお願いします。


太郎冠者  2009-02-19 11:31:01  No: 141544

GetDCで取得したデバイスコンテキストハンドルは必ずReleaseDCで解放しなくてはならないみたいです。
http://msdn.microsoft.com/ja-jp/library/cc410542.aspx


初心者  2009-02-19 12:45:18  No: 141545

太郎冠者さん早速ご回答有難うございます。

<DllImport("user32")> Private Shared Function ReleaseDC(ByVal hwnd As Integer, ByVal hdc As Integer) As Integer
End Function

Dim hcd As Integer = GetDC(0)

ReleaseDC(0, hcd)

以上のコード追加した所、若干メモリ使用量が上がるものの23.500KB辺りで安定しました。
GetDC開放用の手続きがあったんですね、今後は使うAPIの方も注意して見るようにします。
どうも有難うございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加