2
static void Job47(Args _args)
 {
 str                                  path,stx;
 TreeNodeIterator                     iter;
 TreeNode                             treeNode, treeNodeToRelease;
 Map                                  dictMenuDisplay;
 FormName                             formName;
 MenuItemName                         menuItemName;
 container                            conMenu;
 int                                  i,n;
   ;

 for (n=1;n<=100;n++)
       {
        info(strfmt("iter:%1",n));
        path            ="Menu Items\\Display";
        dictMenuDisplay = new Map(Types::String,Types::Container);
        treenode        = Treenode::findNode(path);
        iter            = treenode.AOTiterator();
        treenode        = iter.next();

        while (treenode)
          {
          formName     = treenode.AOTgetProperty("Object");
          menuItemName = treenode.AOTname();

           if (dictMenuDisplay.exists(formName))
            {
             conMenu = dictMenuDisplay.lookup(formName);
             conMenu = conIns(conMenu,conlen(conMenu)+1,menuItemName);
             dictMenuDisplay.insert(formName,conMenu);
             }

           else
             dictMenuDisplay.insert(formName,[menuItemName]);
                      //  treenode = iter.next();

           if(treeNodeToRelease && SysTreeNode::isApplObject(treeNode))
            {
             treeNodeToRelease.treeNodeRelease();
             treeNodeToRelease=null;
            }

           if(SysTreeNode::isApplObject(treeNode))
            {
              treeNodeToRelease=treeNode;
            }

            treeNode=iter.next();
        }
    }
  }

我收到错误“内部运行堆栈溢出”,代码正确运行到第 86 次迭代,帮助...

4

3 回答 3

3

内核不会立即垃圾收集 TreeNode 对象。完成应用程序对象及其所有子对象的树节点后,您需要调用TreeNode.treeNodeRelease(),然后treeNode=null;让垃圾收集器进行清理。

...
TreeNode treeNodeToRelease;
...

while(treenode)
{

    ... /* do stuff with treenode */

    if(treeNodeToRelease && SysTreeNode::isApplObject(treeNode))
    {
        treeNodeToRelease.treeNodeRelease();
        treeNodeToRelease=null;
    }
    if(SysTreeNode::isApplObject(treeNode))
    {
        treeNodeToRelease=treeNode;
    }
    treeNode=iter.next();
}
于 2011-02-25T17:04:12.893 回答
0

编码:

 if(treeNodeToRelease && SysTreeNode::isApplObject(treeNode))

应替换为:

 if (treeNodeToRelease)

对象的释放不应依赖于下一个对象。

或者这可能就足够了(取代杰的解决方案):

while (treenode)
{
    ... /* do stuff with treenode */
    treeNode.treeNodeRelease();
    treeNode = iter.next();
}
于 2011-03-19T14:41:00.403 回答
0

从手册中引用:

如果您在同一执行过程中在多个树节点上运行此方法 ( treeNodeRelease() ),则可能会占用大量资源。您应该在进行过程中卸载树节点,以便让垃圾收集器有机会移除它们。

在调用此方法之前,请确保删除对树节点及其子节点的所有引用。

此外,您至少有 85 个对 treeNodeToRelease (和 treeNode!)的引用 ->在外部循环结束时调用treeNodeToRelease.treeNodeRelease() 。

于 2011-05-17T10:37:01.683 回答