2008-09-27 37 views

Trả lời

3

Như Raymond Chen đặt nó một thời gian trước, nếu bạn đang suy nghĩ về cửa sổ giới hạn xử lý, có lẽ bạn đang làm điều gì sai :)

Dù sao, tôi đặt cược không có C# cách đặc biệt để làm điều đó, bởi vì nó rất đặc trưng cho hệ thống. Bạn có thể sử dụng các hàm tương tự mà bạn sẽ sử dụng trong một ứng dụng C++. Gọi các hàm bằng P/Invoke. Để tìm hiểu cách viết hàng nhập, hãy truy cập pinvoke.net.

Chỉnh sửa: Khi tôi hiểu câu hỏi của bạn, tôi cho rằng bạn đã biết cách thực hiện điều đó trong ứng dụng Win32.

15

Nếu bạn đọc bài đăng của Raymond Chen, có thể bạn sẽ thấy nó khó chịu như tôi đã làm. Bạn chỉ "có thể làm điều gì đó sai" bởi vì bạn đang làm một cái gì đó Windows không có khả năng.

Trong ứng dụng của tôi, lần đầu tiên người dùng truy cập trang tab, tôi tạo và bố trí tất cả các điều khiển trên trang đó. Điều này cần một lượng thời gian đáng chú ý - có thể dễ dàng có 50 điều khiển trên một trang. Vì vậy, tôi không loại bỏ các điều khiển trên một trang tab sau khi điền nó, nếu nó có thể, và để lại tập hợp các trang tab cho người dùng.

Khi điều đó xảy ra, một số người dùng không bao giờ muốn đóng bất kỳ bộ trang nào. Tại sao tôi phải ép buộc họ? Với giao diện người dùng của tôi, họ có thể điều hướng rất nhanh đến bất kỳ một trong số hơn 300 bộ giao dịch mà họ chịu trách nhiệm quản lý. Máy của họ đủ nhanh, và có đủ bộ nhớ, để làm cho tất cả điều này rất nhạy. Vấn đề duy nhất là Windows không thể hỗ trợ nó.

Tại sao tôi sử dụng điều khiển chứ không phải một số công nghệ giao diện người dùng khác? Vì chúng hoạt động. Tôi cần hỗ trợ các sự kiện trọng tâm, thứ tự tab, sự kiện xác thực, bố cục động và ràng buộc dữ liệu - người dùng thực sự đang quản lý hàng nghìn bản ghi, trong hàng tá bảng, trong một bộ dữ liệu trong bộ nhớ. Số lượng phát triển tôi sẽ phải làm để - nói - thực hiện một cái gì đó bằng cách sử dụng điều khiển không cửa sổ là thiên văn.

Tôi chỉ "làm sai" vì Windows có giới hạn cứng về số lượng cửa sổ xử lý mà nó có thể hỗ trợ. Giới hạn cứng đó được dựa trên một loạt các giả định thập kỷ về cách giao diện người dùng của máy tính có thể được xây dựng. Đó không phải là tôi "đang làm điều gì đó sai trái".

Ở mức nào, giải pháp của tôi cho điều này là hai phần.

Thứ nhất, một lớp có thể cho bạn biết có bao nhiêu cửa sổ xử lý quá trình bạn đang sử dụng:

using System; 
using System.Runtime.InteropServices; 

namespace StreamWrite.Proceedings.Client 
{ 
    public class HWndCounter 
    { 
     [DllImport("kernel32.dll")] 
     private static extern IntPtr GetCurrentProcess(); 

     [DllImport("user32.dll")] 
     private static extern uint GetGuiResources(IntPtr hProcess, uint uiFlags); 

     private enum ResourceType 
     { 
      Gdi = 0, 
      User = 1 
     } 

     public static int GetWindowHandlesForCurrentProcess(IntPtr hWnd) 
     { 
      IntPtr processHandle = GetCurrentProcess(); 
      uint gdiObjects = GetGuiResources(processHandle, (uint)ResourceType.Gdi); 
      uint userObjects = GetGuiResources(processHandle, (uint)ResourceType.User); 

      return Convert.ToInt32(gdiObjects + userObjects); 
     } 
    } 
} 

Thứ hai, tôi duy trì một bộ nhớ cache gần đây ít sử dụng các đối tượng trang tab của tôi. Khuôn khổ .NET không cung cấp một lớp bộ nhớ cache LRU chung, vì vậy tôi đã xây dựng một lớp, mà bạn có thể nhận được here nếu bạn cần. Mỗi lần người dùng truy cập trang tab, tôi thêm nó vào Bộ nhớ cache LRU. Sau đó, tôi kiểm tra xem tôi có chạy thấp trên tay cầm cửa sổ không.Nếu tôi, tôi vứt bỏ các điều khiển trên trang tab ít được sử dụng gần đây nhất, và tiếp tục làm điều đó cho đến khi tôi có đủ cửa sổ xử lý một lần nữa.

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