Hola a todos. He creado una ventana con una barra de progreso y un botón "Cancelar" en ella. La intención es permitir que el usuario detenga la ejecución del programa. Sin embargo, recibo un error cuando presiono cancelar y no sé cómo resolverlo. A continuación se muestra una versión simplificada de mi script.
Names Default to Here(1);
//Define progress window
pwin = NewWindow("Progress",
SB_L = SpacerBox(Size(0, 15), Color("Green")),
ButtonBox("Cancel",
pwin << Close Window;
Stop();
)
);
//Sample Loop
For(i=1, i<=10, i++,
SB_L << Size(i*10, 15); //update the progress bar
Wait(1); //rest of loop
);Si presiono Cancelar mientras el bucle se está ejecutando, aparece el siguiente error:
deleted object reference: SB_L << Size(i * 10, 15) in access or evaluation of 'Glue' , pwin = New Window("Progress",
SB_L = Spacer Box(Size(0, 15), Color("Green")),
Button Box("Cancel",
pwin << Close Window;
Stop();
)
); /*###*/For(i = 1, i <= 10, i++,
SB_L << Size(i * 10, 15);
Wait(1);
) /*###*/;Cuando se presiona el botón cancelar, mi expectativa es que la ventana de progreso se cierre y luego la ejecución se detenga. Pero parece continuar durante al menos una iteración y falla en la línea SB_L << Size () en el bucle For. Falla porque la ventana de progreso se ha cerrado y SB_L se ha eliminado, pero estoy confundido por qué se ejecuta esta línea si se emitió el comando Stop ().
¿Estoy en lo cierto de que la ejecución del programa continúa incluso después de mi comando Stop ()? ¿Cómo puedo evitar la ejecución del comando SB_L << Size () después de presionar el botón Cancelar?
Detalles:
JMP Pro 15.2.1
Mac OS Big Sur v11.6
Gracias.
Hola @nikles . Es posible que desee consultar esta publicación reciente de @Craige_Hales , Barra de progreso con botón Cancelar .
Gracias Ryan (y Craige). Esta fue una opción que definitivamente estoy considerando, pero requiere enviar una bandera a una cláusula if en el cuerpo del script principal. Mi deseo es detener la ejecución del programa usando el comando Detener () en el botón Cancelar. Tal vez pueda reformular mi pregunta: ¿por qué mi comando Stop () no parece detener la ejecución?
Acabo de notar algo más interesante. Si comento el comando "pwin << Cerrar ventana ()" en el script del botón Cancelar, el botón cancelar ya no detiene la ejecución. Parece que el comando Detener () no puede detener el ciclo For cuando se ejecuta desde un botón. El botón Cancelar podía detener la ejecución antes solo porque al eliminar la ventana se creaba un error.
wait(n) es un mal necesario en JMP, que debe evitarse en la medida de lo posible. Durante una espera, la secuencia de comandos que llama a esperar se detiene mientras el sistema operativo puede hacer cosas, como reconocer un clic o hacer visible una ventana abierta. Pueden suceder cosas extrañas, porque puede usar el clic para iniciar otro script (su ejemplo) que toca el entorno del primer script. En su ejemplo, stop() detiene el segundo script. También puede establecer una bandera global. Si su proyecto es lo suficientemente grande como para preocuparse por realizar un seguimiento de las variables globales, también puede usar espacios de nombres.
Entonces, ¿qué es lo raro que puede pasar? La mayoría de las veces se cierran ventanas o se eliminan cuadros de visualización. En particular, imagina una función de clic que tiene un script que usa esperar (1), y vuelves a hacer clic en el botón, medio segundo después. Una segunda copia del script se está ejecutando dentro de la primera. El wait(1) original no volverá hasta que finalice el segundo script. Si la segunda secuencia de comandos cierra la ventana en la que se encuentra el botón, ¿qué entorno rodea a la secuencia de comandos original? (¡No es el mismo que antes de la espera!) No cree scripts que requieran una espera sin una buena razón; la mayoría de las veces displaybox<<