2008-10-21 25 views
51

Bu hatayı bir Winform uygulamasında görüyoruz. Bu hatayı neden gördüğünüze ve daha da önemlisi bunu nasıl düzelteceğinize ya da olmasını engellemeye yardımcı olabilir.Winforms issue - Pencere tanıtıcısı oluşturulurken hata oluştu

 
System.ComponentModel.Win32Exception: Error creating window handle. 
    at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp) 
    at System.Windows.Forms.Control.CreateHandle() 
    at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
    at System.Windows.Forms.Control.CreateControl() 
    at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e) 
    at System.Windows.Forms.ButtonBase.OnVisibleChanged(EventArgs e) 

cevap

42

GDI Nesneleri, İğneleri, Konuları ve USER nesnelerine bakmak için Process Explorer veya Windows Görev Yöneticisi'ni çalıştırdınız mı? Değilse, görüntülenecek sütunları seçin (Görev Yöneticisi Görünüm-> Sütun Seç'i seçin ... Daha sonra uygulamanızı çalıştırın ve o uygulama için bu sütunlara bir göz atın ve bunlardan birinin gerçekten büyüyüp gelişmediğine bakın.

Bu kadar temizlenir sen düşünmek UI bileşenleri var ama Elden edilmemiş olması olabilir. yararlı olabileceğini bu konuda

Here's a link.

Good Luck!

+1

Bu soruna rastladım ve uygulamamın 9600+ USER Objects ve 1800+ GDI Object olduğunu bildirdi. Sorunum yanlış bir şey yapmıyorum, sadece bir FlowLayoutPanel öğeye çok fazla öğe ekliyorum. Sanırım görüntülenen verilere 'sayfa' yazmam gerekecek ... –

1

Normalde bellek yetersiz bilgisayar ile ilgili olduğunu düşünüyorum, böylece daha fazla pencere tanıtıcıları oluşturamıyor. Normalde pencereler bu noktada bazı garip davranışlar göstermeye başlar.

+0

. . . – leora

-1

dışarı bellek önerisi kötü bir sonuç gibi görünmüyor.

Programınız bu hatayı aldığında ne yapıyor?

Çok sayıda pencere veya denetim oluşturuyor mu? Tasarım zamanında aksine programlı olarak yaratıyor mu? Öyleyse, bunu bir döngüde mi yapıyorsunuz? Bu döngü sonsuz mu? Başka bir şekilde şaşırtıcı tekne yükü tüketiyor musunuz?

Görev yöneticisi uygulamanız tarafından kullanılan belleği izlediğinizde ne olur? Ay'a mi fırlıyor? Ya da daha iyisi, yukarıda önerildiği gibi detaylara dalmak için proses monitörünü kullanın.

21

Uygulamanızın windows tanıtıcısı sınırı 10.000 tanıtıcıdır. Hatayı alıyorsunuz, çünkü programınız çok sayıda tanıtıcı yaratıyor. Bellek sızıntısını bulmanız gerekecek. Diğer kullanıcıların önerdiği gibi, bir Bellek Profiler kullanın. Ben de .NET Memory Profiler kullanıyorum. Ayrıca, formunu formdan kaldırırsanız, form kapatma yöntemini çağırıyorsunuz (formlar atılmayacaktır). Ayrıca, kontrol ile kaydedilmiş hiçbir olay olmadığından emin olmanız gerekir. Kendimi aynı sorunu yaşıyorum ve zaten bildiğim şeye rağmen, yine de bazı bellek sızıntılarım var. Benimle ilgili olarak hala devam ediyor ..

0

Uygulamamda da aynı hatayı alıyorum. Tek bir sayfada birçok denetim yüklüyorum. Düğme tıklatma olayında denetimleri temizliyorum. Kontroller bellekte denetimleri bırakmıyor. Denetimleri bellekten ayırın. Sadece controls.clear() yöntemini yorumladım ve denetimleri elimine etmek için birkaç satır kod ekledim. ControlCollection içinde kontrol olarak her bir CTL için bu

gibi şey

ctl'i.()

Sonraki Bu sorun hemen her zaman GDI Nesnesi sayısı ile ilgilidir

5

, Kullanıcı Nesnesi sayımı elden veya Kulp saymak ve çünkü makinenizde dışı bir bellek durumunun genellikle değil.

Bu hatalardan birini izlediğimde, ProcessExplorer'ı açıp şu sütunları izlerim: Tutamaçlar, Konular, GDI Nesneleri, KULLANICI Nesneleri, Özel Baytlar, Sanal Boyut ve Çalışma Kümesi.

(Benim durumumda, sorun genellikle bir olay işleyicisi nesne tutan ve bertaraf edilmesini engelleyen nedeniyle bir nesne sızıntısı budur.)

2

Eh, benim durumumda dışarı edildi kesinlikle KULLANICI Nesneleri oldu kontrol Windows Görev Yöneticisi'ne baktım ve eminim ki, USER Objects sayısı tam olarak 10'000 idi.

Nesnenin veya özellik sayfasının kapsayıcı panelini Sekme Sayfası'nınkiyle ayarlayarak, özellik sayfalarını ve Sayfa Sayfalarını dinamik olarak Sekme Sayfalarına yerleştiriyorum. Şartlı olarak listelenen koleksiyonun türüne veya incelenen nesnenin sınıf tipine bağlı olarak özellik ve liste sayfası formlarını geri dönüştürüyorum veya yeniden oluşturuyorum.

NB: Delphi'de, tüm denetimlerin bir Sahibi ve bir Ana özelliği vardı. Kontrolün Ana Mülkiyeti değiştirilse bile, mülk sahibi kontrolün imha edilmesiyle hala sahibi tarafından bertaraf edilir. C# 'de bir kontrol örneğinde olduğu gibi görünür. bir Panel, bir Form için bir sekme sayfası için Panel.Parent özelliği değiştirerek, formdaki Dispose() çağrısı panelini yok atar, Tab Sayfası'nda Controls.Clear() çağırır. Veli'nin elle null değerine ayarlanmaması durumunda, doğrudan bir çağrı olan Panel.Dispose() yöntemi aslında atmayacaktır.

1

Ben o iş yapar çek ... bu hep doğrudur

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

eklendi, ancak formu atar onsuz bir hata. BTW, tanıtmam gereken her şey yaklaşık 4.9 milyon

+0

Kullandığınız özellik, Handle özelliğinin uygulanıp uygulanmadığını denetler. .NET kaynak koduna bakmak: 'public IntPtr Handle {get {... if (! This.IsHandleCreated) {this.CreateHandle(); } ...}} 'IsHandleCreated' özelliği, tanıtıcıyı oluşturmadan true/false döndürür. –

İlgili konular