потоки coldfusion внутри циклов теряют объем

В настоящее время я изо всех сил пытаюсь справиться с потоками. У меня есть ощущение, что это может быть связано с моими прицелами; однако я не вижу, где я ошибаюсь.

Мой 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).

где я могу ошибаться?


person Jarede    schedule 19.02.2013    source источник
comment
Я запустил это без ошибок на CF 9 (9,0,2,282541). Он вернул структуру counts с пустым массивом a.   -  person imthepitts    schedule 20.02.2013
comment
хммм, он действительно должен возвращать структуру с массивами со структурами из потоков ... но, вероятно, мой код неверен, основная проблема для меня - это то, что local.x не существует ... не уверен, как это отладить проблема.   -  person Jarede    schedule 20.02.2013
comment
Это точный код? Сначала мне это не удалось, потому что в CFC не было функции init(). Если это сокращенная версия, внесите точный код, и, надеюсь, я смогу воспроизвести вашу ошибку.   -  person imthepitts    schedule 20.02.2013
comment
это не точный код... в init нет ничего, что могло бы повлиять на это... хотя application.cfc мог бы, который сложнее разобрать и вставить   -  person Jarede    schedule 20.02.2013
comment
Не знаю, что сказать вам о том, что переменная local.x не определена, но этот код не будет делать то, на что вы надеетесь. Структура local.s содержит только один элемент — пустой массив local.a. В настоящее время local.a передается как пустое для каждого потока, а затем оно не изменяется внутри потока. Таким образом, он выходит пустым до сих пор. Чтобы структура возвращала счетчики из потоков, вам нужно передать эту структуру в поток и добавить к ней массивы в блоке потока.   -  person imthepitts    schedule 20.02.2013


Ответы (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.

person Jarede    schedule 20.02.2013

Если проблема в том, что переменная local.x не увеличивается, начните с комментирования всего, что связано с потоками. Замените его на writedump локального. Запишите дамп локальной области до и после цикла.

Как только вы получите увеличение local.x, добавьте пустые потоки. Продолжайте создавать дамп локальной области, чтобы увидеть, не является ли это причиной проблемы. Если local.x все еще увеличивается, добавляйте очень маленькие фрагменты кода, пока не найдете фрагмент, вызывающий проблему.

person Dan Bracuk    schedule 19.02.2013
comment
поэтому, как только я добавляю тег потока без ничего в local.x, он прерывается. - person Jarede; 20.02.2013