Obrigado por responder Gustavo. O que acho estranho é que exatamente a mesma lógica que eu usava para renderizar antes de refatorar. E a quantidade de objetos era muito maior.
A complexidade do calculo executado é O(n), e em cada loop o número de interações é aproximadamente 300. Acho que realmente não é algo tão pesado para estar dando esse problema. Principalmente para apenas 20 objetos ele já estar ocorrendo. Sendo que antes ele renderizava aproximadamente 3000 objetos sem nem chiar. Att, Fredy. 2009/12/8 Gustavo Kawamoto <[email protected]> > Pelo jeito você tem BASTANTE cálculo para fazer hem? rs > Esse erro acontece quando você trava a renderização por mais de 15 > segundos. > O que acontece é que não existe renderização direta no Actionscript durante > a execução de um código, só depois dele. Então se houver um loop muito > grande dentro de um bloco de código, por exemplo, o próprio Flash Player > reconhece como um travamento e, para não travar a máquina do usuário, ele > pergunta ao usuário se quer parar de executar seu código. > > A solução mais comum para este tipo de problema é dividir o código em > blocos de execução, usando timers ou o próprio enterFrame do Sprite. > Ou então rever o código para descobrir o porque de estar lento e limar > algumas partes, ou executá-las depois ;) > > -- > Gustavo Y. Kawamoto > > > 2009/12/8 Fredy Gadotti <[email protected]> > > Olá pessoal, >> >> >> estava refatorando meu código pois ele estava começando a ficar muito >> horrível, ai fui aplicar o padrão Strategy e meu código começou a dar um >> erro que nunca tinha visto antes. >> E procurando no Google, tinha apenas duas páginas comentando sobre isso, e >> nenhuma foi de real ajuda. >> >> Bom, o que fiz para simular o erro. >> >> Eu criei, uma interface com os métodos que eu precisava. >> Na classe onde ia aplicar a estratégia eu criei uma variável do tipo da >> interface e criei um setter para instanciar a classe concreta que aplica >> minha estratégia. >> >> Mais ou menos assim: >> >> *var _strategy:IStrategy;* >> * >> * >> *private function set strategy(value:IStrategy):void {* >> * _stragety = value;* >> * >> * >> * createHeaders(); //* talvez o erro seja aqui, mas não >> tenho certeza, será que fica muito pesado chamar dentro do setter? deveria >> fazer como? *creationComplete?* >> *}* >> * >> * >> *private function createHeaders():void {* >> * _stragety.width = 50; // *valores ficticios >> * _strategy.daysGap = 365; // *valores ficticios >> * _strategy.view = this;* >> * _strategy.createHeaders(); * >> *}* >> >> >> >> ai ele vai chamar uma das classes concretas que tem o createHeaders() e >> ele faz um monte de calculo para criar meus cabeçalhos. >> E logo depois de chamar a updateDisplayList, ele dá o pau. >> >> Antes de refatorar, eu criava tudo dinamicamente uma coleção de 3000 >> objetos e não dava problema, e todo o código ficava dentro de uma classe com >> if e else encadeados. Simplesmente encapsulei a lógica, e agora mesmo com >> uma coleção de dados pequena e ele dá o erro, com certa de 20 objetos. >> >> *Segue o stack trace:* >> >> Error: Error #1502: Um script foi executado por mais tempo que o período >> limite padrão de 15 segundos. >> at >> mx.managers.layoutClasses::PriorityQueue/removeSmallestChild()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\managers\layoutClasses\PriorityQueue.as:214] >> at >> mx.managers::LayoutManager/validateClient()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\managers\LayoutManager.as:895] >> at >> mx.core::UIComponent/validateNow()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\core\UIComponent.as:5550] >> at >> mx.core::Container/createOrDestroyScrollbars()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\core\Container.as:4481] >> at >> mx.core::Container/createScrollbarsIfNeeded()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\core\Container.as:4349] >> at >> mx.core::Container/createContentPaneAndScrollbarsIfNeeded()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\core\Container.as:4165] >> at >> mx.core::Container/validateDisplayList()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\core\Container.as:2702] >> at >> mx.managers::LayoutManager/validateDisplayList()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\managers\LayoutManager.as:602] >> at >> mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\managers\LayoutManager.as:657] >> at Function/http://adobe.com/AS3/2006/builtin::apply() >> at >> mx.core::UIComponent/callLaterDispatcher2()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\core\UIComponent.as:8460] >> at >> mx.core::UIComponent/callLaterDispatcher()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\core\UIComponent.as:8403] >> >> >> >> >> Bom, sei que o email ficou um pouco longo, mas agradeceria se alguém >> tivesse alguma sugestão. >> >> >> >> >> Att, >> >> Fredy Gadotti. >> >> >> > > > > --~--~---------~--~----~------------~-------~--~----~ Você recebeu esta mensagem porque está inscrito na lista "flexdev" Para enviar uma mensagem, envie um e-mail para [email protected] Para sair da lista, envie um email em branco para [email protected] Mais opções estão disponíveis em http://groups.google.com/group/flexdev -~----------~----~----~----~------~----~------~--~---
