2

我目前正在努力掌握线程。我有一种感觉,这可能与我的范围有关;但是,我看不出我哪里出了问题。

我的 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 会返回错误Element X is undefined in LOCAL。.

我无法弄清楚为什么在循环的第一次迭代后它会丢失local.x(我已经通过在循环开始和循环结束时进行转储来证明这一点,并且它无法到达本地.x = 2)。

我可能哪里出错了?

4

2 回答 2

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。

于 2013-02-20T11:02:08.040 回答
0

如果问题是变量 local.x 没有增加,首先注释掉所有线程的东西。将其替换为本地的 writedump。在循环之前和之后也写入本地范围。

一旦你得到 local.x 递增,添加空线程。继续 writedump 本地范围,以便您可以查看这是否是导致问题的原因。如果 local.x 仍在增加,请添加非常小的代码,直到找到导致问题的位。

于 2013-02-19T23:51:08.463 回答