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してみたりもしましたが、効果が見られませんでした。
リソースを旨く開放しつつメモリ使用量が上がらないプログラムにするにはどうしたら良いでしょうか?
どうぞ宜しくお願いします。
GetDCで取得したデバイスコンテキストハンドルは必ずReleaseDCで解放しなくてはならないみたいです。
http://msdn.microsoft.com/ja-jp/library/cc410542.aspx
太郎冠者さん早速ご回答有難うございます。
<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の方も注意して見るようにします。
どうも有難うございました。
ツイート | ![]() |