2009-02-19 14 views

Respuesta

19

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!

+1

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

+1

Tiene toda la razón, eliminé el código erróneo de mi respuesta para que nadie intente utilizarlo. –

+0

Una forma mucho mejor es dividir la rutina de análisis en llamadas a métodos recursivos, que se llamaría usando callLater – Yaba

9

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); 
} 
1

También hay una función setInterval que llamar a una función a intervalos regulares que podrían ser útil.

1

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

+0

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

3

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.

Cuestiones relacionadas