代码在迭代86时崩溃 [英] Code crashes at iteration 86
本文介绍了代码在迭代86时崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
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次迭代,帮助...
I get the error "overflow in internal run stack",the code runs till 86th iteration correctly, help...
推荐答案
内核不会立即垃圾收集TreeNode对象.在为应用程序对象及其所有子对象完成一个树节点之后,您需要调用TreeNode.treeNodeRelease()
,然后调用treeNode=null;
以清理垃圾收集器.
The kernel doesn't immediately garbage collect TreeNode objects. Once you are done with a treenode for an application object and all it's children, you need to call TreeNode.treeNodeRelease()
, followed by treeNode=null;
to let the garbage collector clean up.
...
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();
}
这篇关于代码在迭代86时崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文