Complemento JMP: Aislamiento de múltiples instancias con espacios de nombresHola comunidad de JMP,
Estoy creando un complemento para JMP que crea ventanas, almacena variables globales y llama a funciones. Todo funciona correctamente con una sola instancia, pero cuando el usuario ejecuta el complemento dos veces, las dos instancias comparten el mismo ámbito global y las variables comienzan a entrar en conflicto (una ventana sobrescribe el estado de la otra).
Inicialicé mi script con Names default to here(1), incluso creé mi propio espacio nuevo (ns = newspace()) y coloqué todas las variables en él, pero aún así tengo el conflicto. Conozco el concepto de espacio de nombres de ventana, pero también quiero evitar conflictos en las variables fuera de la ventana.
// Launch this script twice — second run breaks the first window
strLabel = "Instance A";
counter = 0;
win = New Window( "Test " || strLabel,
btn = Button Box( "Click me",
counter++;
btn << Set button name( strLabel || " clicked " || Char( counter ) || "x" );
)
);
Automatización y secuencias de comandosRe: Complemento JMP: Aislamiento de múltiples instancias con espacios de nombresSi cada ventana es independiente, recomiendo usar el espacio de nombres de ventana, diseñado precisamente para esto:
Names default to here(1):
// Functions outside the window are still accessible
rand = function({}, floor(random uniform(10)));
win = New Window("Values",
show toolbars(0), show menu(0),
// You can put statements above display elements
window:randomvalue = rand();
v list box(
text box("Enter a value for this box:"),
// All references to display elements should be in the window namespace
window:teb = text edit box(""),
// Examples reading and writing values.
button box("Update random value", window:randomvalue = rand() ),
button box("Get values from this window",
window:tb << Set Text(
"Random value: " || char(window:randomvalue) ||
"\!NEntered Value: " || (window:teb << Get Text)
)
),
window:tb = text box("")
)
);
// You can get to this from outside the window, but make sure this namespace is protected too - for example from inside another window.
show(win:randomvalue, win:teb << Get Text);
Re: Complemento JMP: Aislamiento de múltiples instancias con espacios de nombresLa opción más sencilla es usar el espacio de nombres de la ventana. Creo que la segunda opción más sencilla (si ignoramos el cuadro de contexto) sería usar un espacio de nombres con nombre, SI es posible nombrarlos. Otra alternativa sería utilizar un espacio de nombres con nombre, agrupar los valores en listas o matrices asociativas y acceder a ellos. Los espacios de nombres anónimos también deberían funcionar, pero requerirán un trabajo adicional para acceder al espacio de nombres correcto dentro de la ventana.
Re: Complemento JMP: Aislamiento de múltiples instancias con espacios de nombresHola, gracias por tu respuesta. Implementaré el espacio de nombres de la ventana, pero la parte donde extraigo la variable fuera de la ventana es un poco difícil, ya que el nombre de la ventana es el mismo si ejecuto varias instancias.
Re: Complemento JMP: Aislamiento de múltiples instancias con espacios de nombresUna solución útil es ejecutar todo desde la ventana en lugar de iniciar un script y solicitar la entrada del usuario a mitad de la ejecución. Incluso si no se necesita la entrada del usuario de inmediato, se puede abrir una ventana que diga "Iniciando..." y, en el script On Open(), colocar todo lo que se muestra antes de la ventana, pero con variables de ámbito local o de ventana. Con scripts largos, esto puede complicarse, pero entonces se podría considerar dividirlos en diferentes funciones definidas antes de la ventana, o incluso en archivos distintos.
Como ejemplo, la columna de validación para el complemento de datos de procesamiento de series temporales está escrita de esta manera. Observe cómo UpdateUI se define en este script en la línea 274 antes de que se llame a New Window (disculpen si esto causa problemas a futuros lectores), y luego se llama cuando se presiona un botón en la línea 670 y cuando se actualizan otros campos.
Tenga en cuenta que esta función llama a variables de ventana constantemente; su propósito principal es actualizar la interfaz de usuario. Para la mayoría de los complementos, no recomiendo esto; en su lugar, pase toda la información necesaria como argumentos/parámetros y luego use todas las variables locales dentro de la función, devolviendo únicamente los resultados.
Re: Complemento JMP: Aislamiento de múltiples instancias con espacios de nombresTambién podrías usar sin problemas el espacio de nombres `here` si estás ejecutando el complemento. No funcionará si lo ejecutas desde la misma ventana de script, pero si ejecutas el script desde ventanas de script separadas, sí debería funcionar.