开发者

Recursive conditions

Sorry to put up yet another recursion question, but I've looked over a fair few on here and haven't found the solution for my problem.

I use the below function:

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

To build an AccessibleTreeItem representing the entire GUI of a Java application. However, this function takes 5-6 seconds to run. I'm only looking for one particular subsection of the tree (Lets call it Porkchops).

What I'd like to do is prior to building the tree, get the values and as soon as acRole.name == "Porkchop", use that as the parent object and create an AccessibleTreeItem that represents the subtree.

How on earth do I manage this? If this is a simple question, apologies, but it's driving me crazy.

Edit 1 - The performance hit is encountered on releaseJavaObject(), as when I remove that line the function completes in less than a second, but it creates a horrible memory leak.

Therefore, I'm not really looking for alternative solutions, as I know that the above does work correctly. I just need some way to check the value of acInfo.name prior to creating the tree, and then using the correct acInfo node as the parent.

Edit 2 - See the attached image for a better explanation than my rambling. Currently, the function will pull this entire tree from the JVM. I've highlighted the appropriate section that I work with, and would like to know if there's a way that will allow me to get that information, without building the entire tree. Or even if I could just return the tree once all children of that node have been populated.

Recursive conditions

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜