In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Consulta sobre tFuture

Foro de Xailer profesional en español
Responder
Avatar de Usuario
bingen
Mensajes: 449
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Consulta sobre tFuture

Mensaje 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 }
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
ignacio
Site Admin
Mensajes: 8781
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Consulta sobre tFuture

Mensaje 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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
bingen
Mensajes: 449
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Consulta sobre tFuture

Mensaje 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
Última edición por bingen el Jue Ene 21, 2021 1:29 pm, editado 1 vez en total.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
bingen
Mensajes: 449
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Consulta sobre tFuture

Mensaje 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?
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
bingen
Mensajes: 449
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Consulta sobre tFuture

Mensaje 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 ?¿?¿?¿?¿?¿
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
ignacio
Site Admin
Mensajes: 8781
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Consulta sobre tFuture

Mensaje 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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
ignacio
Site Admin
Mensajes: 8781
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Consulta sobre tFuture

Mensaje 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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
bingen
Mensajes: 449
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Consulta sobre tFuture

Mensaje 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.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Responder