Рекурсивные условия

Извините, что поставил еще один вопрос о рекурсии, но я просмотрел несколько из них и не нашел решения для моей проблемы.

Я использую функцию ниже:

    unsafe
    {
        // Allocate global memory space for the size of AccessibleContextInfo and store the address in acPtr
        IntPtr acPtr = Marshal.AllocHGlobal(Marshal.SizeOf(new AccessibleContextInfo()));
        try
        {

            Marshal.StructureToPtr(new AccessibleContextInfo(), acPtr, true);
            if (WABAPI.getAccessibleContextInfo(vmID, ac, acPtr))
            {
                acInfo = (AccessibleContextInfo)Marshal.PtrToStructure(acPtr, typeof(AccessibleContextInfo));
                if (!ReferenceEquals(acInfo, null))
                {
                    AccessibleTextItemsInfo atInfo = new AccessibleTextItemsInfo();

                    if (acInfo.accessibleText)
                    {
                        IntPtr ati = Marshal.AllocHGlobal(Marshal.SizeOf(new AccessibleTextItemsInfo()));
                        WABAPI.getAccessibleTextItems(vmID, ac, ati, 0); //THIS IS WHERE WE DO IT
                        atInfo = (AccessibleTextItemsInfo)Marshal.PtrToStructure(ati, typeof(AccessibleTextItemsInfo));
                        if (ati != IntPtr.Zero)
                        {
                            Marshal.FreeHGlobal(ati);
                        }

                    }
                    AccessibleTreeItem newItem = BuildAccessibleTree(acInfo, atInfo, parentItem, acPtr);
                    newItem.setAccessibleText(atInfo);


                    if (!ReferenceEquals(newItem, null))
                    {
                        for (int i = 0; i < acInfo.childrenCount; i++)
                        {
                            //Used roles = text, page tab, push button
                            if (acInfo.role_en_US != "unknown" && acInfo.states_en_US.Contains("visible")) // Note the optomization here, I found this get me to an acceptable speed
                            {
                                AccessibleContextInfo childAc = new AccessibleContextInfo();
                                IntPtr childContext = WABAPI.getAccessibleChildFromContext(vmID, ac, i);
                                GetAccessibleContextInfo(vmID, childContext, out childAc, newItem);

                                if (childContext != IntPtr.Zero)
                                {
                                    Settings.Save.debugLog("Releasing object " + childContext.ToString() + " from JVM: " + vmID);
                                    WABAPI.releaseJavaObject(vmID, childContext);
                                    childContext = IntPtr.Zero;
                                }
                            }
                        }
                    }

                    return newItem;
                }
            }
            else
            {
                acInfo = new AccessibleContextInfo();
            }
        }
        finally
        {
            if (acPtr != IntPtr.Zero)
                Marshal.FreeHGlobal(acPtr);
        }
    }
    return null;
}

Создать AccessibleTreeItem, представляющий весь графический интерфейс Java-приложения. Однако для запуска этой функции требуется 5-6 секунд. Я ищу только один конкретный подраздел дерева (давайте назовем его Porkchops).

Я хотел бы до создания дерева, получить значения и, как только acRole.name == "Porkchop", использовать его в качестве родительского объекта и создать AccessibleTreeItem, который представляет поддерево.

Как же я справлюсь с этим? Если это простой вопрос, прошу прощения, но это сводит меня с ума.

Редактировать 1 - снижение производительности встречается в releaseJavaObject(), так как, когда я удаляю эту строку, функция завершается менее чем за секунду, но это вызывает ужасную утечку памяти.

Поэтому я не очень ищу альтернативные решения, так как знаю, что вышесказанное работает правильно. Мне просто нужен какой-то способ проверить значение acInfo.name до создания дерева, а затем использовать правильный узел acInfo в качестве родителя.

Редактировать 2 - см. Прикрепленное изображение для лучшего объяснения, чем мой бессвязный. В настоящее время функция будет извлекать все это дерево из JVM. Я выделил соответствующий раздел, с которым я работаю, и хотел бы знать, если есть способ, который позволит мне получить эту информацию, не создавая всего дерева. Или даже если бы я мог просто вернуть дерево, как только все дочерние элементы этого узла будут заполнены.

0 ответов

Другие вопросы по тегам