2010-07-14 15 views
5

¡Gracias por responder! Pero todavía no puedo hacerlo. El error que obtengo es "Element objGet1 no está definido en un objeto Java de la clase de tipo coldfusion.runtime.VariableScope".Obtiene el valor de las variables que se ejecutan en cfloop usando cfthread join

A continuación se muestra mi código completo. Solo quiero descargar el valor de cada hilo que contiene información cfhttp.

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

<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> 

y cuando uso después de hilo de unión dentro del bucle. I obtener los resultados deseados Gracias !!

Respuesta

4

Dos problemas pasando aquí.

Según lo señalado por Zugwalt, debe pasar explícitamente las variables que desea referencia dentro del alcance de su hilo. Perdió la variable CGI, ese alcance no existe dentro de su hilo. Así que pasamos justo lo que necesitamos usar en el hilo, userAgent, strBaseURL e intGet.

Segundo problema, una vez que se unen, sus hilos no están en el alcance variable, están en el alcance cfthread, así que tenemos que leerlos desde allí.

código corregido:

<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> 
+0

¡Buenas capturas, Anthony! No miré con la suficiente atención al problema completo, pero por suerte ¡realmente lo clavaste! – Zugwalt

3

Generalmente, variables sin ámbito llegar a poner en el alcance Variables, por lo que puede utilizar la notación de soporte de estructura para referirse a ellos:

Variables['objGet#intGet#'] 

o

Variables['objGet'&intGet] 

Ambos son básicamente haciendo lo mismo - sólo diferentes sintaxis.

+0

sigue recibiendo el error !! –

+0

Hmmm, ¿puedes confirmar que si pones que descarga el primero? Además, intente configurar el 'nombre' en' cfthread' a '" variables.objGet # intGet # "' - no debería ser necesario, pero no he necesitado utilizar cfthread todavía, por lo que no estoy del todo seguro de cómo se comporta . –

0

El código ejecutado dentro de una etiqueta cfthread tiene su propio alcance. Intente pasar la variable a la que desea acceder como atributo. Me gusta nombrar algo diferente solo para ayudarme a seguir.

<!--- 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> 

Cuestiones relacionadas