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 }
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.
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
Consulta sobre tFuture
BiSoft Desarrollo de software profesional
http://www.bisoft.es
http://www.bisoft.es
- ignacio
- Site Admin
- Mensajes: 9253
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: Consulta sobre tFuture
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
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
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
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
http://www.bisoft.es
Re: Consulta sobre tFuture
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?
¿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
http://www.bisoft.es
Re: Consulta sobre tFuture
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 ?¿?¿?¿?¿?¿
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
http://www.bisoft.es
- ignacio
- Site Admin
- Mensajes: 9253
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: Consulta sobre tFuture
El primero es un EXTENDED code-block. El segundo, es un code-block estándar. Mas info en: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?
http://harbouradvisor.blogspot.com/2011 ... locks.html
- ignacio
- Site Admin
- Mensajes: 9253
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: Consulta sobre tFuture
Posiblemente se esté violando la primera regla de oro (de mi artículo en el blog):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 ?¿?¿?¿?¿?¿
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
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.
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
http://www.bisoft.es