Нити холодного синтеза внутри петель теряют прицел
В настоящее время я изо всех сил пытаюсь справиться с темами. У меня есть ощущение, что это может быть связано с моими прицелами; Тем не менее, я не вижу, где я иду не так с этим.
Мой 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 возвращается с ошибкой. Элемент X не определен в LOCAL.,
Я не могу понять, почему он теряет local.x после первой итерации цикла (я доказал это, выполнив дамп в начале цикла и в конце цикла, и он не может добраться до local.x = 2).
где я могу пойти не так?
2 ответа
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.
Если проблема в том, что переменная local.x не увеличивается, начните с закомментирования всего потока. Замените его на письменный код местного. Записал также локальную область видимости до и после цикла.
Как только вы увеличите local.x, добавьте пустые темы. Продолжайте писать локальную область видимости, чтобы увидеть, является ли это причиной проблемы. Если local.x все еще увеличивается, добавляйте очень маленькие биты кода, пока не найдете бит, который вызывает проблему.