¿Es posible llamar a una función de forma asíncrona en Flex? Quiero analizar un archivo a intervalos regulares sin bloquear el resto de la aplicación, ¿cuál es el enfoque recomendado para esto?Llamada a función asíncrona en Flex
Respuesta
Actionscript no es compatible con multihilo, que creo que es lo que realmente está preguntando aquí.
Si bien la funcionalidad no es inherente a actionscript (o Flex), puede configurar un simulacro de sistema utilizando eventos y temporizadores.
estoy un poco confuso en su pregunta exacta, así que voy a dar dos respuestas:
1) que desea procesar un archivo cada pocos segundos para actuar sobre cualquier cambio.
En este caso todo lo que necesita hacer es configurar un temporizador para comprobar periódicamente el archivo:
var fileTimer:Timer = new Timer(5000);
fileTimer.addEventListener(TimerEvent.TIMER, checkFile);
...
private function checkFile(event:TimerEvent):void {
// read the file and do whatever you need to do.
}
2) Usted desea analizar un archivo muy grande, pero no desea que la aplicación cuelgue mientras lo hace.
Si desea procesar el archivo en segundo plano, manteniendo la aplicación principal en buen estado, entonces probablemente crearía una función que analizaría varias líneas del archivo y luego enviaría un evento y lo devolvería. Escuche el evento e inicie un temporizador que esperaría unos pocos milisegundos antes de volver a llamar a la función para analizar el siguiente conjunto de líneas.
Esto interrumpiría el análisis de un archivo grande con suficiente tiempo de inactividad para que el resto de la aplicación funcione sin problemas. Tendría que jugar con el intervalo del temporizador y el número de líneas para analizar a la vez para lograr un buen equilibrio de capacidad de respuesta y el tiempo necesario para analizar el archivo.
Espero que tenga sentido!
La respuesta más simple es usar la rutina callLater
- vea alguna documentación here.
callLater(parseFile, [filename]);
...
public function parseFile(filename : String) : void
{
// parse the file
}
Otro enfoque es utilizar la llamada setTimeout
, definida en el paquete flash.utils
. Esta le permite llamar a una rutina después de que ha transcurrido un período de tiempo específico. El uso de esta rutina, se puede configurar la función de parseFile
a llamarse a sí mismo en repetidas ocasiones, que le da los intervalos regulares que buscaban:
parseFile(filename);
...
public function parseFile(filename : String) : void
{
// parse the file
// call this function again in 5 seconds
setTimeout(parseFile, 5000, filename);
}
También hay una función setInterval
que llamar a una función a intervalos regulares que podrían ser útil.
Curiosamente, ayer mismo described a solution a este problema en respuesta a un different question.
setTimeout y setInterval están en desuso.
La clase Timer no solo permite un retraso, sino también un repeatCount: cuántas veces lanzará un evento TIMER y comenzará la cuenta regresiva nuevamente. Presumiblemente, uno llamaría a myTimer.stop() dentro del evento antes de hacer lo que quisiera, y myTimer.start() cuando haya terminado.
private function newLinesToParse() : void
{
myTimer = new Timer(30000, 9999);
myTimer.addEventListener(Timer.TIMER, myTimerTick);
myTimer.start();
}
private function myTimerTick(event : Event) : void
{
myTimer.stop(); // or (event.currentTarget as Timer).stop();
// do a few lines
if (anyMoreLines)
myTimer.start();
else
myTimer = null;
}
Saludos
re obsoleto, lea http://stackoverflow.com/questions/2683398/timer-vs-settimeout/2688969#2688969 « Para todos aquellos que dicen que setTimeout está en desuso, esto no tiene sentido ... »[sic] – nalply
Lo que necesita es un concepto llamado Green threads. Hay un green threading lib por ahí, pero no lo he usado.
La implementación que hice para un proceso de importación (1 a 5 minutos) realmente rastreó el tiempo que llevaban las ejecuciones y permitió una cantidad configurable de tiempo por ciclo. Esto le permite elegir la cantidad de fotogramas que eliminó (simplemente actualizamos una barra de progreso modal). También lo clasifiqué con una versión que corría a través de un ICollectionView con un IViewCursor y disparaba el evento con cada elemento.
No puedo suministrar el código fuente debido a su conexión con un producto comercial, pero el concepto es bastante simple de implementar.
- 1. función asíncrona llamada C++ 0x
- 2. asíncrona llamada de función para C++
- 3. Devolución de llamada asíncrona concurrente
- 4. setTimeout en la función asíncrona
- 5. Convierta el evento en una llamada asíncrona
- 6. Prueba de la unidad función asíncrona
- 7. Devolución de llamada sincrónica y asíncrona
- 8. Llamada asíncrona con espera en HttpClient nunca devuelve
- 9. obtener los datos de la función asíncrona
- 10. PHP llamada a función Colocación
- 11. Convención de llamada personalizada X86_64 a C llamada a función
- 12. Capturando una excepción lanzada en una devolución de llamada asíncrona
- 13. Cómo suspender un hilo hasta que se reciba la devolución de llamada para la función asíncrona?
- 14. Cómo activarse la función de llamada en php para cada otra llamada a la función
- 15. Llamada al sistema vs Llamada a la función
- 16. ¿Puedo vincular una propiedad del componente Flex a una función?
- 17. Llamada a la función c desde Java
- 18. Llamada a la función indefinida curl_init().?
- 19. llamada ambigua a la función estática sobrecargada
- 20. Llamada a la función no definida apache_request_headers()
- 21. llamada a filter_var función no definida()
- 22. Javascript llamada a la función anónima
- 23. Llamada a la función no definida sqlite_open
- 24. llamada a curl_init función no definida()
- 25. Función de llamada recursiva a intervalos regulares
- 26. llamada a la función jQuery de JavaScript
- 27. javascript: función de llamada a sí
- 28. ¿Cómo hacer que jQuery pase argumentos personalizados a funciones de devolución de llamada asíncrona AJAX?
- 29. Llamada a la función anulada de la función de anulación
- 30. llamada función anidada en Python
Flash Player no se procesará mientras se esté ejecutando ActionScript. validateNow() forzará a un componente de Flex a dibujar, pero en realidad no se representa en la pantalla hasta que todo el código ActionScript en un marco haya terminado de ejecutarse. – joshtynjala
Tiene toda la razón, eliminé el código erróneo de mi respuesta para que nadie intente utilizarlo. –
Una forma mucho mejor es dividir la rutina de análisis en llamadas a métodos recursivos, que se llamaría usando callLater – Yaba