Obter o valor das variáveis de execução em cfloop usando cfthread participar
-
15-09-2020 - |
Pergunta
Obrigado por responder!!Mas ainda não estou capaz de fazê-lo.Erro que eu estou ficando é "Elemento objGet1 é indefinido em um objeto Java do tipo classe coldfusion.o tempo de execução.VariableScope."
Abaixo está o meu código completo.Eu só quero despejar o valor de cada thread que contém cfhttp informações.
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>
e quando eu uso depois de thread de ingressar dentro do loop.Eu e obter os resultados desejados Obrigado!!
Solução
Dois problemas acontecendo aqui.
Como apontado por Zugwalt, você precisa passar explicitamente em variáveis que você deseja referência no âmbito do seu segmento.Ele perdeu a variável CGI, que o escopo não existe dentro do seu segmento.Então, podemos passar apenas o que precisamos para uso no segmento, userAgent, strBaseURL, e intGet.
Segundo problema, uma vez associado, o seu threads não estão no escopo de variável, eles estão no cfthread escopo, temos de lê-los de lá.
Código corrigido:
<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>
Outras dicas
Geralmente, sem escopo de variáveis obter colocar no Variables
escopo, portanto, você pode usar a estrutura de suporte de notação para se referir a eles:
Variables['objGet#intGet#']
ou
Variables['objGet'&intGet]
Estes são os dois fazendo basicamente a mesma coisa - apenas sintaxes diferentes.
Código executado dentro de um cfthread marca tem o seu espaço próprio.Tentar passar a variável que você deseja para o acesso como um atributo.Eu gosto de citar é algo diferente só para me ajudar a manter o controle.
<!--- 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>