2010-07-14 9 views
5

Cảm ơn bạn đã trả lời !! Nhưng tôi vẫn không thể làm được. Lỗi mà tôi nhận được là "Yếu tố objGet1 không được xác định trong đối tượng Java thuộc loại lớp coldfusion.runtime.VariableScope."Nhận giá trị của các biến chạy trong cfloop bằng cách sử dụng cfthread join

Dưới đây là mã đầy đủ của tôi. Tôi chỉ muốn đổ giá trị của mỗi luồng chứa thông tin 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> 

và khi tôi sử dụng sau khi chuỗi tham gia bên trong vòng lặp. Tôi nhận được kết quả mong muốn Cảm ơn !!

Trả lời

4

Hai vấn đề xảy ra ở đây.

Như được chỉ ra bởi Zugwalt, bạn cần phải chuyển rõ ràng các biến mà bạn muốn tham chiếu trong phạm vi của chuỗi của bạn. Ông đã bỏ lỡ biến CGI, phạm vi đó không tồn tại trong chuỗi của bạn. Vì vậy, chúng tôi chỉ chuyển vào những gì chúng tôi cần sử dụng trong chuỗi, userAgent, strBaseURL và intGet.

Vấn đề thứ hai, khi đã tham gia, chuỗi của bạn không nằm trong phạm vi biến đổi, chúng nằm trong phạm vi cfthread, vì vậy chúng tôi phải đọc chúng từ đó.

đang Corrected:

<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

Tốt bắt Anthony! Tôi đã không xem xét kỹ lưỡng toàn bộ vấn đề nhưng may mắn là bạn thực sự đóng đinh nó! – Zugwalt

3

Nói chung, các biến chưa được điều chỉnh được đưa vào phạm vi Variables, vì vậy bạn có thể sử dụng ký hiệu khung struct để chỉ cho họ:

Variables['objGet#intGet#'] 

hoặc

Variables['objGet'&intGet] 

Cả hai đều là về cơ bản làm điều tương tự - chỉ cần cú pháp khác nhau.

+0

vẫn nhận được lỗi !! –

+0

Hmmm, bạn có thể xác nhận rằng nếu bạn đặt là nó đổ kết quả đầu tiên? Ngoài ra, hãy thử đặt 'tên' trong' cfthread' thành '" variables.objGet # intGet # "' - không cần thiết, nhưng tôi không cần sử dụng cfthread, vì vậy không hoàn toàn chắc chắn cách nó hoạt động . –

0

Mã chạy bên trong thẻ cfthread có phạm vi riêng. Hãy thử truyền biến mà bạn muốn nó truy cập dưới dạng thuộc tính. Tôi thích đặt tên cho nó một cái gì đó khác nhau chỉ để giúp tôi theo dõi.

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