2010-07-14 6 views
5

Vielen Dank für die Beantwortung! Aber ich bin immer noch nicht dazu in der Lage. Fehler, den ich bekomme, ist "Element objGet1 ist in einem Java-Objekt des Typs class coldfusion.runtime.VariableScope nicht definiert."Erhalten Wert der Variablen in cfloop mit cfthread Join

Unten ist mein voller Code. Ich möchte nur den Wert jedes Threads mit cfhttp Informationen ausgeben.

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> 

und wenn ich nach der Faden innerhalb der Schleife verbinden. I erhalten die gewünschten Ergebnisse Dank !!

Antwort

4

Zwei Probleme hier passiert.

Wie von Zugwalt angemerkt, müssen Sie Variablen, die Sie im Rahmen Ihres Threads referenzieren möchten, explizit übergeben. Er hat die CGI-Variable verpasst, dieser Bereich existiert nicht in deinem Thread. Wir übergeben also genau das, was wir im Thread verwenden müssen, userAgent, strBaseURL und intGet.

Zweites Problem, sobald sie beigetreten sind, sind Ihre Threads nicht im variablen Bereich, sie sind im cfthread Bereich, also müssen wir sie von dort lesen.

Corrected Code:

<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

Gute Fänge Anthony! Ich habe das ganze Problem nicht genau genug untersucht, aber zum Glück hast du es wirklich geschafft! – Zugwalt

3

Allgemeinen unscoped Variablen legte in den Variables Umfang erhalten, so dass Sie struct Klammer-Notation beziehen sich auf sie verwenden können:

Variables['objGet#intGet#'] 

oder

Variables['objGet'&intGet] 

beide im Grunde handelt sich um das gleiche tun - nur verschiedene Syntaxen.

+0

noch Fehler bekommen !! –

+0

Hmmm, können Sie bestätigen, dass, wenn Sie setzen, dass es das erste ausgibt? Versuchen Sie auch, 'name' in' cfthread' auf '" variables.objGet # intGet # "' zu setzen - sollte nicht notwendig sein, aber ich musste noch nicht cfthread verwenden, also nicht ganz sicher, wie es sich verhält . –

0

Code, der in einem cfthread-Tag ausgeführt wird, hat seinen eigenen Bereich. Übergeben Sie die Variable, auf die sie zugreifen soll, als Attribut. Ich nenne es gerne etwas anderes, um mir den Überblick zu behalten.

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