Как Вы получаете Текущее количество Дескриптора Окна и Предел Дескриптора Окна в.NET?

10
задан 27 September 2008 в 08:03
поделиться

3 ответа

Как Raymond Chen выразился некоторое время назад, если Вы думаете о пределах дескриптора окна, Вы, вероятно, делаете что-то не так :)

Так или иначе я держал пари, что нет никакого специального способа C# сделать это, потому что это является очень определенным для системы. Можно использовать те же функции, которые Вы использовали бы в приложении C++. Вызовите функции с помощью P/Invoke. Чтобы изучить, как записать импорт, перейдите к pinvoke.net.

Править: Поскольку я понимаю Ваш вопрос, я предполагаю, что Вы уже знаете, как сделать это в приложении Win32.

3
ответ дан 3 December 2019 в 20:07
поделиться

Если Вы будете читать сообщение Raymond Chen, то Вы, вероятно, найдете его столь раздражающим, как я сделал. Вы только, "вероятно, делаете что-то не так", потому что Вы делаете что-то, к чему Windows не способен.

В моем приложении, в первый раз, когда пользователь посещает вкладку, я создаю и размечаю все средства управления на той странице. Это занимает значимое количество времени - на странице может легко быть 50 средств управления. Таким образом, я не отбрасываю средства управления на вкладке после заполнения его, если это вообще возможно, и отпуск заключительные наборы вкладок до пользователя.

Как это происходит, некоторые пользователи никогда не хотят закрыть любые наборы вкладок. Почему я должен вынуждать их к? С моим UI они могут перейти очень быстро к любому из 300 + наборы транзакций, что они ответственны за управление. Их машины достаточно быстры, и имеют достаточно памяти, для создания этого всего очень быстро реагирующим. Единственная проблема состоит в том, что Windows не может поддерживать его.

Почему я использую средства управления и не некоторую другую технологию UI? Поскольку они работают. Я должен поддерживать события фокуса, порядок вкладки, события проверки, динамическое расположение и привязку данных - пользователи на самом деле управляют тысячами записей, в десятках таблиц, в DataSet в оперативной памяти. Объем разработки, которую я должен был бы сделать к - говорит - реализуют что-то с помощью средств управления без окон, является астрономическим.

Я только "делаю его неправильно", потому что Windows имеет жесткий предел количества дескрипторов окна, которые это может поддерживать. Тот жесткий предел основан на наборе старых десятилетием предположений о том, как мог бы быть создан UI компьютера. Это не я, кто "делает что-то не так".

Во всяком случае мое решение этого находится в двух частях.

Во-первых, класс, который может сказать Вам, сколько окно обрабатывает Ваш процесс, использует:

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);
        }
    }
}

Во-вторых, я поддерживаю последний использованный кэш своих объектов вкладки. Платформа.NET не обеспечивает универсальный класс кэша LRU, таким образом, я создал один, который можно получить здесь при необходимости в том. Каждый раз, когда пользователь посещает вкладку, я добавляю его к Кэшу LRU. Затем я проверяю, чтобы видеть, испытываю ли я нехватку дескрипторов окна. Если я, я выбрасываю средства управления на последней использованной вкладке и продолжаю делать это, пока у меня нет достаточного количества дескрипторов окна снова.

16
ответ дан 3 December 2019 в 20:07
поделиться

Полная кавычка, к которой обращается OregonGhost,

Если необходимо спросить, Вы, вероятно, делаете что-то не так.

Это от того, Почему предел окна, обрабатывает 10,000 для каждого процесса? Необходимо считать это.

0
ответ дан 3 December 2019 в 20:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: