我目前正在努力掌握线程。我觉得可能与我的示波器有关;但是,我无法看到我在哪里出错。
我的CFC包含以下功能:
<cfcomponent output="false" hint="thread stuff.">
<cffunction name="threadTest" access="public" returntype="struct">
<cfscript>
local.lstOne = "1,2,3,4,5,6";
local.a = [];
local.s = {};
local.lst = "";
for(local.x = 1; local.x lte listlen(local.lstOne,','); local.x++){
local.lst &= (len(local.lst) gt 0) ? ',thr#local.x#' : 'thr#local.x#';
thread action="run" name="thr#local.x#" nIndex="#local.x#" aArray="#local.a#"{
thread.y = attributes.nIndex;
thread.aArray = attributes.aArray;
if(thread.y mod 2){
thread.c = 1;
} else {
thread.c = 0;
}
thread.stArgs = {};
thread.stArgs.nMod = thread.c;
arrayAppend(thread.aArray, thread.stArgs);
}
}
threadJoin(local.lst);
local.s.counts = local.a;
return local.s;
</cfscript>
</cffunction>
</cfcomponent>
我的CFM页面看起来有点像这样:
<cfscript>
theThread = createObject( "component", "ThreadStuff" ).init();
theThread.threadTest();
</cfscript>
当我运行时,coldfusion返回错误在LOCAL中未定义元素X。。
我无法解决为什么它在循环的第一次迭代后丢失 local.x (我已经通过在循环的开头和结尾处进行转储来证明这一点。循环,它无法到达local.x = 2)。
我可能在哪里出错?
答案 0 :(得分:1)
Coldfusion 9.0.0(此问题中使用的版本:9,0,0,251028)有一个错误,当在一个函数的循环中使用一个线程时,本地作用域会中断。
此问题已在Coldfusion 9.0.1中修复,请参阅此处的详细信息:http://helpx.adobe.com/coldfusion/kb/issues-fixed-coldfusion-9-0.html id:80153。
答案 1 :(得分:0)
如果问题是变量local.x没有递增,那么首先注释掉所有的线程内容。用一个当地的减压泵替换它。在循环之前和之后Writedump本地范围。
一旦你获得local.x递增,添加空线程。继续写入本地范围,以便查看是否是导致问题的原因。如果local.x仍在递增,请添加非常小的代码,直到找到导致问题的位。