Implement a threading to prevent UI block on a bug in an async function

Posted by Marcx on Stack Overflow See other posts from Stack Overflow or by Marcx
Published on 2012-05-10T10:38:20Z Indexed on 2012/09/29 9:38 UTC
Read the original article Hit count: 217

I think I ran up againt a bug in an async function...

Precisely the getDirectoryListingAsync() of the File class... This method is supposted to return an object containing the lists of files in a specified folder.

I found that calling this method on a direcory with a lot of files (in my tests more than 20k files), after few seconds there is a block on the UI until the process is completed...

I think that this method is separated in two main block: 1) get the list of files 2) create the array with the details of the files

The point 1 seems to be async (for a few second the ui is responsive), then when the process pass from point 1 to point 2 the block of the UI occurs until the complete event is dispathed...

Here's some (simple) code:

private function checkFiles(dir:File):void
{ 
   if (dir.exists)
   {
     dir.addEventListener( FileListEvent.DIRECTORY_LISTING, listaImmaginiLocale);
     dir.getDirectoryListingAsync(); 
    // after this point, for the firsts seconds the UI respond well (point 1),
    // few seconds later (point 2) the UI is frozen
   }
}


private function listaImmaginiLocale( event:FileListEvent ):void
{
 // from this point on the UI is responsive again...
}

Actually in my projects there are some function that perform an heavy cpu usage and to prevent the UI block I implemented a simple function that after some iteration will wait giving time to UI to be refreshed.

private var maxIteration:int = 150000;
private function sampleFunct(offset:int = 0) :void
{
  if (offset < maxIteration)
  {
   // do something

   // call the recursive function using a timeout..
   // if the offset in multiple by 1000 the function will wait 15 millisec, 
   // otherwise it will be called immediately
   // 1000 is a random number for the pourpose of this example, but I usually change the 
   // value based on how much heavy is the function itself...
   setTimeout(function():void{aaa(++offset);}, (offset%1000?15:0));
  } 
}

Using this method I got a good responsive UI without afflicting performance... I'd like to implement it into the getDirectoryListingAsync method but I don't know if

  1. it's possibile
  2. how can I do it
  3. where is the file to edit or extend..

Any suggestion???

© Stack Overflow or respective owner

Related posts about multithreading

Related posts about actionscript-3