递归条件

时间:2011-09-09 00:24:13

标签: c# recursion conditional-statements

很抱歉提出另一个递归问题,但我在这里看了很多,但没有找到解决我问题的方法。

我使用以下功能:

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

构建表示Java应用程序的整个GUI的AccessibleTreeItem。但是,此功能需要5-6秒才能运行。我只是在寻找树的一个特定部分(让我们称之为Porkchops)。

我想要做的是在构建树之前获取值,并且只要acRole.name ==“Porkchop”,将其用作父对象并创建表示子树的AccessibleTreeItem。

我该怎样管理这个?如果这是一个简单的问题,请道歉,但它让我发疯。

编辑1 - 在releaseJavaObject()上遇到性能损失,因为当我删除该行时,该函数在不到一秒的时间内完成,但它会造成可怕的内存泄漏。

因此,我并不是在寻找替代解决方案,因为我知道上述方法可以正常工作。我只需要一些方法在创建树之前检查acInfo.name的值,然后使用正确的acInfo节点作为父节点。

编辑2 - 请参阅附图,以获得比漫无边际更好的解释。目前,该函数将从JVM中提取整个树。我已经突出显示了我使用的相应部分,并且想知道是否有一种方法可以让我获取该信息,而无需构建整个树。或者,即使我已经填充了该节点的所有子节点,我也可以返回树。

enter image description here

0 个答案:

没有答案