Recurrencia JSL prevenidaDesde el cambio a JMP 13 desde JMP 12, sigo encontrando errores debido a la "recurrencia JSL prevenida". En general, esto es algo bueno, ya que tuve que corregir las malas prácticas en mi base de código, sin embargo, a menudo solo limita la funcionalidad. Donde lo veo actualmente es en uno de mis informes. Tengo un botón de "filtro", que vuelve a ejecutar la pantalla filtrando los datos especificados por el usuario. Si el usuario presiona ese botón demasiadas veces, obtiene un error de "Recurrencia JSL prevenida" que elimina el script. ¿Hay alguna forma de apagar esto? A veces quiero recursividad, ¡puede ser algo bueno! Este error ha sido la ruina de mi existencia desde JMP 13.
Re: Recursión JSL impedidaGracias Craig, esto fue muy beneficioso. Sí, estoy usando wait(0) en mi script. Intenté cambiarlo porque vi un gran aumento de velocidad con la ventana de actualización, pero creo que esperar (0) es lo que tendré que usar. Esto responde a varias de mis preguntas y me ayuda a comprender un poco mejor lo que sucede debajo del capó. ¡Gracias!
Re: Recursión JSL impedida¿Está utilizando declaraciones de espera ()? Tal vez pueda cambiar a usar dt<<
Utilicé esto para tratar de entender lo que está sucediendo:
New Window( "x",
t = Text Box( "" ),
Button Box( "updatewindow",
print("pressed updatewindow");
start = Tick Seconds();
For( i = 1, i < 1e3, i++,
t << settext( Char( i ) );
t << updatewindow;
);
stop = Tick Seconds();
t << settext( Char( stop - start, 4, 1 ) );
),
Button Box( "wait",
print("pressed wait");
start = Tick Seconds();
For( i = 1, i < 1e3, i++,
t << settext( Char( i ) );
Wait( 0 );
);
stop = Tick Seconds();
t << settext( Char( stop - start, 4, 1 ) );
)
);
cambie el 1e3 a 1e4 si corre demasiado rápido. El botón "esperar" permite que se procesen los eventos, incluido cualquier botón que se presione durante el script que se está ejecutando "esperar". El botón "ventana de actualización" solo actualiza el cuadro de texto y pone en cola clics adicionales hasta que finaliza el script.
A veces, esperar () es inevitable; cuando se inicia una plataforma, no aparecerá en la pantalla sin una espera(). Y el procesamiento en segundo plano de JMP también requiere una espera () en un script que está en bucle (sockets, programa de ejecución, conexiones de base de datos, probablemente otros).
El mensaje de registro no parece que deba dañar nada; Creo que es solo una advertencia de que se ha ignorado una segunda pulsación del mismo botón antes de que finalice la secuencia de comandos del botón.
Re: Recursión JSL impedidaAsí que encontré una solución a mi problema, no tengo idea de por qué funciona. Lo primero que hice fue mover << Obtener comandos seleccionados a la función de ejecución y simplemente pasar el cuadro combinado, y esto solucionó el 99% de mis problemas de recursividad. No entiendo esta parte, así que si alguien de JMP pudiera aclararme por qué sería esto, se lo agradecería.
Lo segundo que tuve que hacer fue deshabilitar el botón mientras se ejecutaba el código, b/c si un usuario hacía doble clic lo suficientemente rápido, causaría un error de recurrencia debido a que el primer clic del botón aún intentaba ejecutarse. Esta parte tiene sentido para mí, pero no parece que deba codificarla. Un usuario que hace clic en un botón no debería causar un error de recurrencia. A lo sumo, simplemente debe agregar el nuevo clic en la pila de procesamiento; y al menos debería ignorar el clic adicional. En realidad, nunca debería intentar ejecutarlo nuevamente para causar el problema de recursividad.
//Old Script
BBRun = button box("Run Filter",
layerId = layer_cb << Get Selected;
classId = class_cb << Get Selected;
runFunction(dt, layerid, classid);
)
//New Script
BBRun = button box("Run Filter",
BBRun << Enable(0);
runFunction(dt, layer_combobox, class_combobox);
BBRun << Enable(1);
)<BR /><BR />//Run Function for reference<BR />runFunction = function({dt, layer_cb, class_cb}, {Default Local}, <BR /> //Grab data<BR /> layerId = layer_cb << Get Selected;<BR /> classId = class_cb << Get Selected;<BR /> <BR /> //Create namespace to pass variables<BR /> If( !Namespace Exists( "filterCode_script" ),<BR /> FC = New Namespace( "filterCode_script" ),<BR /> FC = Namespace( "filterCode_script" )<BR /> );<BR /> //get unique defects<BR /> FC:defects = dt:defects[dt << Get Rows Where(:LAYER_ID == layerId & :CLASS_ID == classId)];<BR /> <BR /> //Create display window for subset<BR /> include("$ADDIN_HOME(myaddin)\Includes\filterWindow.include.jsl", <<NEW context=""></NEW> FC << Delete;<BR /> <BR />);<BR />