Заменить бесконечный цикл в Flex - PullRequest
1 голос
/ 18 июня 2010

Я хочу получить доступ к веб-сервису: getMonitorData () при создании завершить и возвращает массив в бесконечном цикле, так что getIndex0.text обновляется каждый раз.

Flex не может обрабатывать бесконечноецикл и выдает ошибку тайм-аута 1502. Если я запускаю цикл for до тех пор, пока я <2000 или около того, он работает нормально. </p>

Как заменить цикл так, чтобы к моему веб-сервису обращались непрерывно и результат отображался в getIndex0.text.

Вот так выглядит мое приложение:

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300" 
         xmlns:plcservicebean="server.services.plcservicebean.*"
         creationComplete="clientMonitor1()">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;
            import mx.rpc.CallResponder;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;


            [Bindable] public var dbl0:Number;

//-----------Infinite Loop, Works fine if condition = i<2000------------------------
            public function clientMonitor1():void{
                for(var i:int = 0; ; i++){
                    clientMonitor();                    
                }
            }

            public function clientMonitor():void{
                var callResp:CallResponder = new CallResponder();
                callResp.addEventListener(ResultEvent.RESULT, monitorResult);
                callResp.addEventListener(FaultEvent.FAULT, monitorFault);
                callResp.token = plcServiceBean.getMonitorData();
            }

            public function monitorResult(event:ResultEvent):void{
                var arr:ArrayCollection = event.result as ArrayCollection;
                dbl0 = arr[0].value as Number;
            }

            protected function monitorFault(event:FaultEvent):void{
                Alert.show(event.fault.faultString, "Error while monitoring Data ");
            }
        ]]>
    </fx:Script>
    <fx:Declarations>
        <plcservicebean:PlcServiceBean id = "plcServiceBean" 
                                       showBusyCursor="true" 
                                       fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" />
    </fx:Declarations>

    <mx:Form x="52" y="97" 
             label="Double">
        <mx:FormItem label = "getMonitorValue">
            <s:TextInput id = "getIndex0"
                         text = "{dbl0}"/>
        </mx:FormItem>
    </mx:Form>

</s:Group>

Ответы [ 4 ]

4 голосов
/ 18 июня 2010

Ваша проблема в том, что ваш цикл работает синхронно, тогда как фактические вызовы веб-службы асинхронны. Flex использует модель выполнения на основе фреймов и имеет только один поток выполнения - когда вы делаете вызов веб-службе, он инициирует соединение и немедленно возвращается. Цикл навсегда означает, что вы никогда не доберетесь до следующего кадра, где результат может быть обработан. Зацикливание 2000 раз означает, что вы сразу же создаете 2000 соединений, которые будут поставлены в очередь, поскольку вам не разрешено устанавливать столько соединений одновременно. Затем они завершатся в течение следующих нескольких минут.

Способ сделать то, что вы хотите сделать, это, вероятно, подождать, пока один запрос не будет завершен, прежде чем запустить следующий. Чтобы добиться этого, вы можете вызвать clientMonitor() с конца ваших обработчиков событий или настроить дополнительный обработчик событий специально для вызова clientMonitor() после завершения запроса.

1 голос
/ 18 июня 2010

Используйте Таймер .

Запустите таймер.Когда это сработает, остановите таймер, сделайте звонок.Когда звонок вернется, запустите таймер снова.Повторение.Этот тип цикла асинхронного / отложенного таймера не будет использовать процессор или останавливать другой код.

0 голосов
/ 18 июня 2010

Вы можете реализовать псевдорекурсию, добавив прослушиватель событий, который вызывает clientMonitor(), а затем вызвать то же самое событие в конце clientMonitor(). Просто позвоните clientMonitor() один раз, чтобы начать процесс.

0 голосов
/ 18 июня 2010

Мне кажется, что вам нужно что-то вроде сервисов данных LifeCycle, которые позволят вам держать сокет открытым для сервера и разрешать push-уведомления от сервера клиенту.

Постоянное попадание в удаленный веб-сервис кажется мне ужасно плохой идеей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...