Here is some code that will show a very simply way using a timer to show some 
UI before you start your sync stuff. NOTE using a timer is bad because you can 
not guarantee how much time it will take for your UI to display. The best thing 
to do would be create some sort of popup that fires an event when it is fully 
visible. Listen for that even and once that happens then you start your 
synchronous process because at that time you will be sure your UI is ready.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"; layout="absolute">
        <mx:Script>
                <![CDATA[
                        import mx.managers.CursorManager;
                        import mx.events.FlexEvent;
                        import mx.controls.Alert;
                        
                        private function bigNastySynchronousThing():void
                        {
                                trace("running");
                                var i:int = 0;
                                for (i; i < 20000000; i++)
                                {
                                        //trace really slows things down
                                        var x:Number = Math.sqrt(500) / 
Math.sqrt(20);
                                }
                                trace("done");
                        }
                        
                        private function noGood(event:MouseEvent):void
                        {
                                mx.controls.Alert.show("You wont see this 
untill we are done because the ui cant update");
                                bigNastySynchronousThing();
                        }
                        
                        private function kindGood(event:MouseEvent):void
                        {
                                Alert.show("This will take some time, hold on");
                                CursorManager.setBusyCursor();
                                var t:Timer = new Timer(1000, 1);
                                t.addEventListener(TimerEvent.TIMER_COMPLETE, 
tc);
                                t.start();
                        }
                        
                        private function tc(event:TimerEvent):void
                        {
                                trace(event.target);
                                
EventDispatcher(event.target).removeEventListener(event.type, arguments.callee);
                                this.callLater(bigNastySynchronousThing);
                                CursorManager.removeBusyCursor();
                                
                        }
                ]]>
        </mx:Script>
        <mx:Button label="no good" click="noGood(event);"/>
        <mx:Button label="kinda good" click="kindGood(event);" x="81"/>
</mx:Application>


--- In flexcoders@yahoogroups.com, Richard Rodseth <rrods...@...> wrote:
>
> What's a good way to display progress or a busy cursor for a potentially
> long-running, but synchronous operation (in my case generating a PDF using
> AlivePDF) ?
> 
> As noted here,  CursorManager.setBusyCursor doesn't display the cursor until
> there is no code running, and PopupManager seems to act similarly.
> 
> Defer initiation of the operation using a timer?
>


Reply via email to