Рекурсивные условия
Извините, что поставил еще один вопрос о рекурсии, но я просмотрел несколько из них и не нашел решения для моей проблемы.
Я использую функцию ниже:
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. Я выделил соответствующий раздел, с которым я работаю, и хотел бы знать, если есть способ, который позволит мне получить эту информацию, не создавая всего дерева. Или даже если бы я мог просто вернуть дерево, как только все дочерние элементы этого узла будут заполнены.