Programing

Winforms 문제-창 핸들 생성 오류

lottogame 2020. 12. 5. 09:10
반응형

Winforms 문제-창 핸들 생성 오류


이 질문에 이미 답변이 있습니다.

Winform 응용 프로그램에서이 오류가 표시됩니다. 누구든지이 오류가 표시되는 이유와 더 중요한 것은 오류를 수정하거나 발생하지 않도록하는 방법에 대해 도울 수 있습니다.

System.ComponentModel.Win32Exception : 창 핸들을 만드는 동안 오류가 발생했습니다.
   System.Windows.Forms.NativeWindow.CreateHandle (CreateParams cp)에서
   System.Windows.Forms.Control.CreateHandle ()에서
   System.Windows.Forms.Control.CreateControl (Boolean fIgnoreVisible)에서
   System.Windows.Forms.Control.CreateControl ()에서
   System.Windows.Forms.Control.OnVisibleChanged (EventArgs e)에서
   System.Windows.Forms.ButtonBase.OnVisibleChanged (EventArgs e)에서

GDI 개체, 핸들, 스레드 및 USER 개체를보기 위해 프로세스 탐색기 또는 Windows 작업 관리자를 실행 했습니까? 그렇지 않은 경우 표시 할 열을 선택합니다 (작업 관리자는보기-> 열 선택 ...을 선택합니다. 그런 다음 앱을 실행하고 해당 앱의 해당 열을 살펴보고 그중 하나가 정말 커지고 있는지 확인합니다.

그것은 당신이 것을 UI 구성 요소를 가지고 있음을 수 있습니다 생각 정리됩니다를 파기는이되지 않았습니다.

여기에 도움이 될만한 링크 가 있습니다.

행운을 빕니다!


응용 프로그램의 창 핸들 제한은 10,000 개의 핸들입니다. 프로그램이 너무 많은 핸들을 생성하기 때문에 오류가 발생합니다. 메모리 누수를 찾아야합니다. 다른 사용자가 제안했듯이 메모리 프로파일 러를 사용하십시오. .Net Memory Profiler도 사용합니다. 또한 폼이 닫히기 전에 폼에서 컨트롤을 제거하는 경우 컨트롤에서 dispose 메서드를 호출해야합니다 (그렇지 않으면 컨트롤이 삭제되지 않음). 또한 컨트롤에 등록 된 이벤트가 없는지 확인해야합니다. 저도 같은 문제가 있습니다. 이미 알고있는 사실에도 불구하고 여전히 저를 피하는 메모리 누수가 있습니다 ..


"윈도우 핸들 생성 오류" 와 USER 개체 및 데스크톱 힙과의 관계에 대한이 게시물을 참조하십시오 . 몇 가지 해결책을 제공합니다.


이 문제는 거의 항상 GDI 개체 수, 사용자 개체 수 또는 핸들 수와 관련이 있으며 일반적으로 컴퓨터의 메모리 부족 상태 때문이 아닙니다 .

이러한 버그 중 하나를 추적 할 때 ProcessExplorer를 열고 Handles, Threads, GDI Objects, USER Objects, Private Bytes, Virtual Size 및 Working Set 열을 확인합니다.

(내 경험상 문제는 일반적으로 개체를 보유하고 처리하는 것을 방지하는 이벤트 처리기로 인해 개체 누출입니다.)


글쎄, 제 경우에는 확실히 통제 불능 인 USER 객체였습니다. Windows 작업 관리자를 살펴본 결과 USER Objects 수가 정확히 10,000 개였습니다.

속성 또는 목록 시트의 컨테이너 패널의 Parent 속성을 탭 페이지의 속성으로 설정하여 탭 페이지에 속성 및 목록 시트를 동적으로 포함하고 있습니다. 목록에있는 컬렉션 유형 또는 검사중인 개체의 클래스 유형에 따라 속성 및 목록 시트 양식을 조건부로 재활용하거나 재생성하고 있습니다.

NB : Delphi에서 모든 컨트롤에는 Owner와 Parent 속성이 있습니다. 컨트롤의 Parent 속성을 변경하더라도 소유하는 컨트롤이 파괴되었을 때 소유자가 처리합니다.

C #에서는 Panel.Parent 속성을 변경하여 Panel.Parent 속성을 변경하여 Form에서 Tab Page로 프로그래밍 방식으로 다시 할당되는 컨트롤과 같은 컨트롤이 Form에서 Dispose ()를 호출해도 패널이 삭제되지 않고 Controls도 호출되지 않습니다. .Clear () 탭 페이지에서. 직접 호출 Panel.Dispose ()조차도 부모가 미리 수동으로 null로 설정되지 않는 한 실제로 삭제하지 않습니다.


일반적으로 메모리가 부족한 컴퓨터와 관련이 있으므로 더 이상 창 핸들을 만들 수 없습니다. 일반적으로 창은이 시점에서도 이상한 동작을 보이기 시작합니다.


작동하는 수표를 추가했습니다 ...

if (_form.Handle.ToInt32() > 0)
{
   _form.Invoke(method, args);
}

항상 참이지만 양식이 없으면 오류가 발생합니다. BTW, 내 핸들은 약 490 만


내 응용 프로그램에서 동일한 오류가 발생했습니다. 단일 페이지에서 많은 컨트롤을로드하고 있습니다. 버튼 클릭 이벤트에서 컨트롤을 지우고 있습니다. 컨트롤을 지우면 메모리에서 컨트롤이 해제되지 않습니다. 메모리에서 컨트롤을 삭제합니다. 방금 controls.clear () 메서드에 주석을 달고 컨트롤을 처리하는 코드를 몇 줄 포함했습니다. 이 같은

controlcollection의 컨트롤로 각 ctl에 대해

ctl.dispose ()

다음


너무 많은 핸들 (메모리 누수 문제) :

IT 정글 : System.ComponentModel.Win32Exception : 창 핸들 생성 오류


메모리 부족 제안은 나쁜 단서처럼 보이지 않습니다.

이 오류가 발생하는 프로그램은 무엇입니까?

많은 창이나 컨트롤을 만들고 있습니까? 디자인 타임과 달리 프로그래밍 방식으로 생성합니까? 그렇다면 루프에서 수행합니까? 그 루프는 무한합니까? 다른 방식으로 엄청난 양의 메모리를 소비하고 있습니까?

작업 관리자에서 응용 프로그램이 사용하는 메모리를 보면 어떻게됩니까? 달까지 치솟나요? 또는 위에서 제안한대로 프로세스 모니터를 사용하여 세부 사항을 살펴보십시오.

참고 URL : https://stackoverflow.com/questions/222649/winforms-issue-error-creating-window-handle

반응형