Получить значение переменных, запущенных в cfloop, используя cfthread join - PullRequest
5 голосов
/ 14 июля 2010

Спасибо за ответ !!Но я все еще не могу это сделать.Я получаю сообщение об ошибке: «Элемент objGet1 не определен в объекте Java типа класса coldfusion.runtime.VariableScope.»

Ниже приведен мой полный код.Я просто хочу вывести значение каждого потока, содержащего информацию cfhttp.

http://www.google.com/search?" & "q = Vin + Diesel" & "& num = 10" & "& start =") />

<cfset intStartTime = GetTickCount() />

<cfloop index="intGet" from="1" to="10" step="1">

    <!--- Start a new thread for this CFHttp call. --->
    <cfthread action="run" name="objGet#intGet#">

        <cfhttp method="GET" url="#strBaseURL##((intGet - 1) * 10)#" useragent="#CGI.http_user_agent#" result="THREAD.Get#intGet#" />

    </cfthread>

</cfloop>

<cfloop index="intGet" from="1" to="10" step="1">

    <cfthread action="join" name="objGet#intGet#" />
    <cfdump var="#Variables['objGet'&intGet]#"><br />

</cfloop>

и когда я использую после присоединения потока внутри цикла.Я получаю желаемые результаты Спасибо !!

Ответы [ 3 ]

6 голосов
/ 15 июля 2010

Здесь две проблемы.

Как указывает Zugwalt, вам нужно явно передавать переменные, на которые вы хотите сослаться, в рамках вашего потока.Он пропустил переменную CGI, эта область не существует в вашем потоке.Таким образом, мы передаем только то, что нам нужно использовать в потоке userAgent, strBaseURL и intGet.

Вторая проблема: после объединения ваши потоки не находятся в переменной области, они находятся в области cfthread, поэтомучитать их оттуда.

Исправленный код:

<cfloop index="intGet" from="1" to="2" step="1">

    <!--- Start a new thread for this CFHttp call. Pass in user Agent, strBaseURL, and intGet --->
    <cfthread action="run" name="objGet#intGet#" userAgent="#cgi.http_user_agent#" intGet="#intGet#" strBaseURL="#strBaseURL#">

        <!--- Store the http request into the thread scope, so it will be visible after joining--->
        <cfhttp method="GET" url="#strBaseURL & ((intGet - 1) * 10)#" userAgent="#userAgent#" result="thread.get#intGet#"  />

    </cfthread>

</cfloop>

<cfloop index="intGet" from="1" to="2" step="1">

    <!--- Join each thread ---> 
    <cfthread action="join" name="objGet#intGet#" />
    <!--- Dump each named thread from the cfthread scope --->
    <cfdump var="#cfthread['objGet#intGet#']#" />

</cfloop>
3 голосов
/ 14 июля 2010

Как правило, переменные с незаданной областью помещаются в область действия Variables, поэтому вы можете использовать нотацию скобочной структуры для ссылки на них:

Variables['objGet#intGet#']

или

Variables['objGet'&intGet]

Это обав основном делают одно и то же - просто разные синтаксисы.

0 голосов
/ 15 июля 2010

Код, запускаемый внутри тега cfthread, имеет собственную область видимости. Попробуйте передать переменную, к которой вы хотите получить доступ, в качестве атрибута. Мне нравится называть это как-то иначе, чтобы помочь мне следить.

<!--- Start a new thread for this CFHttp call. --->
<cfthread action="run" name="objGet#intGet#" intGetForThread="#intGet#">

    <cfhttp method="GET" url="#strBaseURL##((intGetForThread- 1) * 10)#" useragent="#CGI.http_user_agent#" result="THREAD.Get#intGetForThread#" />

</cfthread>

...