2009-07-28 7 views
1

GDI 핸들 누출 컨트롤에 문제가 있습니다. 나는이 프로그램을 실행하면VB.NET 컨트롤 GDI 핸들 누출?

 
Public Class FancyLabel 
    Inherits Label 

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) 
     e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit 
     MyBase.OnPaint(e) 
    End Sub 

End Class 


의 GDI 개체 수가

(38)가 그럼 난 그것을 하나의 FancyLabel이있는 양식을 열 수 있습니다 : 이 컨트롤의 컷 다운 버전입니다 GDI 개체 수는 42 개로 증가합니다.

다음 양식을 닫으면 GDI 수가 39로 떨어지며 작성하고 닫는 양식이 인데 아무리 많은 인스턴스가 있더라도 그대로 유지됩니다.

어떤 아이디어?

감사 JV

답변

1

그래서 내가 100 번 연속으로 설명한 과정을 계속한다면 GDI 수가 39를 넘지 않는다고 가정합니까?

만약 그렇다면, 당신이 함께해야 할 일이 될 수 있습니다. FancyLabel에 필요한 GDI 개체는 .NET에서 직접 노출하는 것이 아닙니다. 내가 할 수있는 최선의 방법은 모든 기회에 GDI 개체를 포함하는 컨트롤을 처리하는 것입니다. 하지만 귀하의 경우 누출이 그렇게 나쁘지 않고 문제가없는 것처럼 들립니다.

반복적으로 사용하는 GDI 개체가 계속 누출되어 사용자가주의해야하는 누수입니다. 걷어차 기 위해서 GDI 개체 유형은 here으로 표시됩니다. 이 참조는 Windows Forms 컨트롤에 직접적으로 적용되는 것은 아니지만 일부 컨트롤이 무엇을 사용하고 있는지 상상할 수 있습니다 (그리고 다른 곳에서도 설명되어 있습니다).

다행히도 Microsoft는 마침내 WPF로 GDI 개체를 사용하지 않게되었습니다. 순수한 WPF 응용 프로그램은 창 자체에 대해 2 개의 GDI 개체 만 사용합니다 (나머지 UI는 GDI가 없습니다). 따라서 작업중인 프로젝트의 초기 단계에 있다면 WPF를 대신 고려해야 할 때입니다. ;)

+0

동의합니다 .10 개의 FancyLabels을 추가하면 카운트가 39를 넘지 않게되고 컨트롤이 실제로 누출되지 않으며 다른 작업이 진행되고 있습니다. – OwenP

1

잘 GDI 수는 창 형태로 인해 증가 될 수있다. Windows Forms는 시스템이 일부 컨트롤을 렌더링 할 때 간접적으로 GDI를 사용합니다. .NET Memory Profiler을 사용하여 누설 위치를 확인하고 해결 방법을 결정할 수 있습니다.

은 편집 : GDI 오브젝트는 자동으로 가비지 콜렉터에 의해 선택되지 않습니다. Dispose 메서드를 재정의하고 모든 GDI 개체가 올바르게 처리되었는지 확인해야합니다.

+0

양식에 다른 컨트롤이 없습니다. FancyLabel을 일반 System.Windows.Forms.Label로 바꾸면 모든 것이 예상대로 작동합니다. 양식을 닫으면 최종 GDI 수가 37로 돌아갑니다. –

+0

"GDI 개체는 가비지 수집기에서 자동으로 선택되지 않으므로 Dispose 메서드를 재정의하고 모든 GDI 개체가 올바르게 처리되도록해야합니다." 예, 동의하지만, 어디에서나 GDI 개체를 만들지는 않습니다. 기존 그래픽 개체의 열거 형 값을 변경하는 것입니다. 그게 나를 혼란스럽게하는 부분입니다 ... –

0

GDI 개체를 계속 사용하려면 일부 누수 감지기를 사용할 수 있습니다. 이러한 프로그램을 사용하면 각 객체가 만들어진 위치를 보여주는 전체 스택을 볼 수 있습니다.

-1

레이블 글꼴을 설정하면 GDI 개체 수가 증가합니다. 그래서, 당신은 그 라벨의 dispose 메소드를 호출 할 수 있고 그것을 없애기 원한다면 폰트를 null 또는 아무것도 설정하지 않아도됩니다. 이는 예상되는 동작입니다.