Página 1 de 1

Consulta sobre tFuture

Publicado: Lun Ene 18, 2021 12:56 pm
por bingen
Buenas xTeam, despues de estar usan multihilos me he querido pasar a Futuros y me encuentro con que me funciona bien el futuro, pero ponga lo que ponga no me hace ni caso el OnComplete ¿?¿?¿?¿?

METHOD PruebaAsync( aDatos ) CLASS TFormConfiguracion ASYNC
LOCAL oFuture AS CLASS TFuture
LOCAL oTask AS CLASS TFutureTask
LOCAL bWork

oFuture := TFuture():New()

bWork := { ||
Application:oMainForm:oSBMultiHilo:nWidth := 220
Application:oMainForm:oSBPages:nIndex := 2
Application:oMainForm:oSBMultiHiloBtn:cText := "Recopilando agenda telefónica" //Todo esto es para un Progressbar
Application:oMainForm:oSBMultiHiloBtn:nValue := 1
Application:oMainForm:oSBMultiHiloBtn:nMax := 100
AddContactsListDDBB(aDatos, .T.)
RETURN "Agenda telefónica enviada"
}

oTask := oFuture:AddThreadTask( bWork )

oFuture:OnComplete := {|| Application:oMainForm:oSBMultiHiloBtn:cText := LastAwait:ReturnValue ,;
ProcessMessages(1000) ,;
LogDebug("Finalizado") ,;
Application:oMainForm:oSBMultiHilo:nWidth := 0 ,;
Application:oMainForm:oSBPages:nIndex := 1 ,;
Application:oMainForm:oSBMultiHiloBtn:nValue := 0 ,;
Application:oMainForm:oSBMultiHiloBtn:nMax := 0 }

Re: Consulta sobre tFuture

Publicado: Lun Ene 18, 2021 4:43 pm
por ignacio
Hola,

Te ruego le eches un vistazo a nuestro ejemplo de futuros y en concreto la parte que utiliza únicamente OOP y al menos aquí funciona perfectamente.

Creo que hay un error de concepto de como funcionan los futuros y recomiendo leer detenidamente el artículo que publique en el blog que puedes encontrar aquí: https://info.xailer.com/es/?p=1419

Resumiendo:

1) OnComplete DEBE DE ASIGNARSE antes de llamar a TFuture:AddThreadTask() y no después.

2) Por otra parte, veo que estás poniendo la cláusula ASYNC en el método. Esto es absolutamente innecesario ya que se están usando los futuros con sintaxis pura POO. Me remito igualmente al artículo del blog.

Espero que después de leer el artículo queden más claros los motivos.

Un saludo

Re: Consulta sobre tFuture

Publicado: Jue Ene 21, 2021 1:22 pm
por bingen
Ya veo lo que me comentas, primero lo probé sin OOP y me quedo el Async.

Como me indicas cambio el orden del AddThreadTask y el resultado es el mismo, no ejecuta el oncomplete:

Seguiré leyendo a ver si termino de entenderlo, gracias.

METHOD PruebaAsync( aDatos ) CLASS TFormConfiguracion
LOCAL oFuture AS CLASS TFuture
LOCAL oTask AS CLASS TFutureTask
LOCAL bWork

With Object TFuture():New()

bWork := { ||
Application:oMainForm:oSBMultiHilo:nWidth := 220
Application:oMainForm:oSBPages:nIndex := 2
Application:oMainForm:oSBMultiHiloBtn:cText := "Recopilando agenda telefónica"
Application:oMainForm:oSBMultiHiloBtn:nValue := 1
Application:oMainForm:oSBMultiHiloBtn:nMax := 100
AddContactsListDDBB(aDatos, .T.)
RETURN "Agenda telefónica enviada"
}


:OnComplete := {||Application:oMainForm:oSBMultiHiloBtn:cText := LastAwait:ReturnValue ,;
ProcessMessages(1000) ,;
LogDebug("Finalizado") ,;
Application:oMainForm:oSBMultiHilo:nWidth := 0 ,;
Application:oMainForm:oSBPages:nIndex := 1 ,;
Application:oMainForm:oSBMultiHiloBtn:nValue := 0 ,;
Application:oMainForm:oSBMultiHiloBtn:nMax := 0 }

oTask := :AddThreadTask( bWork )

End

RETURN Nil

Re: Consulta sobre tFuture

Publicado: Jue Ene 21, 2021 1:24 pm
por bingen
Por cierto una curiosidad.

¿Porque el codeblock de bWork va con las lineas sin ,; al final y el el codeblock oncomplete si lleva ,; al final de cada linea?

Re: Consulta sobre tFuture

Publicado: Jue Ene 21, 2021 1:57 pm
por bingen
Curiosamente si sustituyo mi función a ejecutar
AddContactsListDDBB(aDatos, .T.)

Por la de samples
FOR nFor := 1 TO 100
Sleep(30)
oFuture:RunSynchroTask( {||::oPb3:nValue := nFor } )
NEXT

Funciona perfectamente el OnComplete ?¿?¿?¿?¿?¿

Re: Consulta sobre tFuture

Publicado: Jue Ene 21, 2021 2:03 pm
por ignacio
bingen escribió:Por cierto una curiosidad.

¿Porque el codeblock de bWork va con las lineas sin ,; al final y el el codeblock oncomplete si lleva ,; al final de cada linea?
El primero es un EXTENDED code-block. El segundo, es un code-block estándar. Mas info en:

http://harbouradvisor.blogspot.com/2011 ... locks.html

Re: Consulta sobre tFuture

Publicado: Jue Ene 21, 2021 2:11 pm
por ignacio
bingen escribió:Curiosamente si sustituyo mi función a ejecutar
AddContactsListDDBB(aDatos, .T.)

Por la de samples
FOR nFor := 1 TO 100
Sleep(30)
oFuture:RunSynchroTask( {||::oPb3:nValue := nFor } )
NEXT

Funciona perfectamente el OnComplete ?¿?¿?¿?¿?¿
Posiblemente se esté violando la primera regla de oro (de mi artículo en el blog):

La primera regla de oro a tener en cuenta es que desde un hilo secundario nunca se debe acceder a la pantalla

Re: Consulta sobre tFuture

Publicado: Jue Ene 21, 2021 4:05 pm
por bingen
Resuelto el misterio, en la función de prueba a la que llamaba había un bucle, en ese bucle de prueba metí un ProcessMessages(1000) y era el que estaba provocando el problema, solo con cambiarlo por un sleep(100) todo va correctamente. Ya es mala suerte también.......

Ahora ya he aplicado el Future al objetivo real que quería y funciona perfectamente.

Gracias por la aención.