2008-10-21 49 views
51

Chúng tôi đang gặp lỗi này trong một ứng dụng Winform. Bất cứ ai có thể giúp đỡ về lý do tại sao bạn sẽ thấy lỗi này, và quan trọng hơn là làm thế nào để sửa chữa nó hoặc tránh nó xảy ra.Vấn đề Winforms - Lỗi khi tạo cửa sổ xử lý

 
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) 

Trả lời

42

Bạn có chạy Process Explorer hoặc Trình quản lý tác vụ Windows để xem các đối tượng GDI, Xử lý, Chủ đề và USER không? Nếu không, hãy chọn các cột đó để xem (Trình quản lý tác vụ chọn Xem-> Chọn Cột ... Sau đó, chạy ứng dụng của bạn và xem các cột đó cho ứng dụng đó và xem liệu một trong số đó có đang phát triển thực sự lớn hay không. nó có thể là bạn đã có các thành phần giao diện người dùng mà bạn nghĩ được làm sạch nhưng chưa được xử lý.

Here's a link về vấn đề này cũng có thể giúp.

Good Luck!

+1

Tôi đã gặp sự cố này và thấy ứng dụng của tôi đã báo cáo 9600+ đối tượng USER và 1800+ đối tượng GDI. Vấn đề của tôi là tôi không làm gì sai, tôi chỉ thêm nhiều mục vào FlowLayoutPanel. Tôi đoán tôi sẽ phải 'trang' dữ liệu được hiển thị ... –

1

Tôi nghĩ nó thường liên quan đến máy tính hết bộ nhớ nên không thể tạo thêm bất kỳ cửa sổ nào. Thông thường, các cửa sổ cũng bắt đầu thể hiện một số hành vi kỳ lạ tại thời điểm này.

+0

mọi thứ cần tập trung vào. . . – leora

-1

Các ra gợi ý về bộ nhớ dường như không phải là khách hàng tiềm năng xấu.

Chương trình của bạn làm gì để nhận được lỗi này?

Có tạo nhiều cửa sổ hoặc điều khiển tuyệt vời không? Liệu nó có tạo ra chúng một cách lập trình trái ngược với thời gian thiết kế? Nếu có, bạn có làm điều này trong một vòng lặp không? Vòng lặp đó có vô hạn không? Bạn có đang sử dụng lượng bộ nhớ đáng kinh ngạc của bộ nhớ theo một cách khác không?

Điều gì xảy ra khi bạn xem bộ nhớ được ứng dụng của bạn sử dụng trong trình quản lý tác vụ? Nó có tăng vọt lên mặt trăng không? Hoặc tốt hơn, như đề nghị ở trên sử dụng màn hình quá trình để đi sâu vào các chi tiết.

21

Giới hạn xử lý cửa sổ cho ứng dụng của bạn là 10.000 tay cầm. Bạn đang gặp lỗi vì chương trình của bạn đang tạo quá nhiều tay cầm. Bạn sẽ cần phải tìm rò rỉ bộ nhớ. Như những người dùng khác đã đề xuất, hãy sử dụng Bộ nhớ Hồ sơ. Tôi cũng sử dụng .Net Memory Profiler. Ngoài ra, hãy đảm bảo bạn đang gọi phương thức vứt bỏ trên các điều khiển nếu bạn xóa chúng khỏi một biểu mẫu trước khi biểu mẫu đóng (nếu không các điều khiển sẽ không được xử lý). Bạn cũng sẽ phải đảm bảo rằng không có sự kiện nào được đăng ký với điều khiển. Bản thân tôi cũng có cùng một vấn đề, và mặc dù những gì tôi đã biết, tôi vẫn có một số rò rỉ bộ nhớ tiếp tục lảng tránh tôi ..

0

Tôi đã gặp lỗi tương tự trong ứng dụng của mình. Tôi đang tải nhiều điều khiển trong một trang .Trong sự kiện nhấp nút, tôi đang xóa các điều khiển.Xoá các điều khiển không phát hành các điều khiển từ bộ nhớ.Đặt các điều khiển khỏi bộ nhớ. Tôi chỉ nhận xét phương thức controls.clear() và bao gồm một vài dòng mã để xử lý các điều khiển. Something như thế này

cho mỗi ctl như kiểm soát trong ControlCollection

ctl.vứt bỏ()

Tiếp

5

Vấn đề này hầu như luôn luôn liên quan đến số lượng đối tượng GDI, tài đếm Object hoặc xử lý đếm và thường không vì một điều kiện out-of-bộ nhớ trên máy tính của bạn.

Khi tôi theo dõi một trong các lỗi này, tôi mở ProcessExplorer và xem các cột sau: Xử lý, Chủ đề, Đối tượng GDI, đối tượng USER, byte riêng, kích thước ảo và bộ làm việc.

(Theo kinh nghiệm của tôi, vấn đề thường là một đối tượng rò rỉ do một event handler giữ đối tượng và ngăn ngừa nó khỏi bị xử lý.)

2

Vâng, trong trường hợp của tôi đó là chắc chắn các đối tượng người dùng mà đã ra kiểm soát. Tôi đã tìm trong Trình quản lý tác vụ Windows và chắc chắn đủ, số lượng đối tượng USER là 10'000 chính xác.

Tôi đang tự động nhúng thuộc tính và danh sách trang tính trong Trang tab bằng cách đặt thuộc tính Gốc của bảng điều khiển vùng chứa của thuộc tính hoặc danh sách thành trang tab. Tôi có điều kiện tái chế hoặc tái tạo tài sản và danh sách biểu mẫu tùy thuộc vào loại bộ sưu tập được liệt kê hoặc loại lớp của đối tượng đang được kiểm tra.

NB: Ở Delphi, tất cả các điều khiển đều có Chủ sở hữu và thuộc tính Gốc. Ngay cả khi đã thay đổi thuộc tính Gốc của một điều khiển, nó vẫn sẽ được xử lý bởi chủ sở hữu của nó khi quyền kiểm soát sở hữu đã bị phá hủy.

Trong C# có vẻ như nếu một điều khiển, ví dụ: một Panel được gán lại từ chương trình, ví dụ, một Form sang trang Tab bằng cách thay đổi thuộc tính Panel.Parent, gọi Dispose() trên Form sẽ không vứt bỏ Panel, cả hai sẽ gọi Controls.Clear() trên trang Tab. Ngay cả một cuộc gọi trực tiếp Panel.Dispose() sẽ không thực sự vứt bỏ nó, trừ khi cha mẹ của nó được tự thiết lập để null trước.

1

tôi đã thêm một tấm séc mà làm cho nó làm việc ...

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

nó luôn luôn là sự thật, nhưng hình thức ném một lỗi mà không có nó. BTW, tay cầm của tôi là khoảng 4,9 triệu

+0

Lưu ý rằng anh ta thực hiện kiểm tra thuộc tính Xử lý để xem liệu trình xử lý có được tạo hay không và nếu không, hãy tạo nó. Nhìn vào mã nguồn .NET: 'public IntPtr Handle {get {... if (! This.IsHandleCreated) {this.CreateHandle(); } ...}} 'Thuộc tính' IsHandleCreated' sẽ trả về cho bạn true/false mà không cần tạo handle. –

Các vấn đề liên quan