Ciao a tutti. Ho creato una finestra con una barra di avanzamento e un pulsante "Annulla" al suo interno. L'intento è quello di consentire all'utente di interrompere l'esecuzione del programma. Ricevo un errore quando premo Annulla e non so come risolverlo. Una versione semplificata del mio script è di seguito.
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
);Se premo Annulla mentre il ciclo è in esecuzione, ottengo il seguente errore:
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);
) /*###*/;Quando viene premuto il pulsante Annulla, la mia aspettativa è che la finestra di avanzamento si chiuda e quindi l'esecuzione si arresti. Ma sembra continuare per almeno un'iterazione e fallisce nella riga SB_L << Size() nel ciclo For. Non riesce perché la finestra di avanzamento è stata chiusa e SB_L è stato eliminato, ma sono confuso perché questa riga viene eseguita se è stato emesso il comando Stop()?
Ho ragione sul fatto che l'esecuzione del programma continua anche dopo il mio comando Stop()? Come posso impedire l'esecuzione del comando SB_L << Size() dopo che è stato premuto il pulsante Annulla?
Particolari:
JMP Pro 15.2.1
Mac OS Big Sur v11.6
Grazie.
Ciao @nikles . Potresti voler dare un'occhiata a questo recente post di @Craige_Hales , Barra di avanzamento con pulsante Annulla .
Grazie Ryan (e Craige). Questa era un'opzione che sto sicuramente prendendo in considerazione, ma richiede l'invio di un flag a una clausola if nel corpo dello script principale. Il mio desiderio è semplicemente interrompere l'esecuzione del programma utilizzando il comando Stop() nel pulsante Annulla. Forse posso riformulare la mia domanda: perché il mio comando Stop() non sembra interrompere l'esecuzione?
Ho appena notato qualcos'altro di interessante. Se commento il comando "pwin << Close Window()" nello script del pulsante Annulla, il pulsante Annulla non interrompe più l'esecuzione. Sembra che il comando Stop() non sia in grado di fermare il ciclo For quando viene eseguito da un pulsante. Il pulsante Annulla era in grado di interrompere l'esecuzione prima solo perché la rimozione della finestra creava un errore.
wait( n ) è un male necessario in JMP, da evitare ove possibile. Durante un'attesa, lo script che chiama wait viene messo in pausa mentre il sistema operativo può eseguire operazioni, come riconoscere un clic o rendere visibile una finestra aperta. Possono succedere cose strane, perché puoi usare il clic per avviare un altro script (il tuo esempio) che tocca l'ambiente del primo script. Nel tuo esempio, stop() sta arrestando il secondo script. Può anche impostare una bandiera globale. Se il tuo progetto è abbastanza grande da preoccuparti di tenere traccia delle variabili globali, puoi anche utilizzare gli spazi dei nomi.
Allora, qual è la cosa strana che può succedere? Per lo più finestre chiuse o displaybox eliminati. In particolare, immagina una funzione clic con uno script che utilizza wait(1) e fai di nuovo clic sul pulsante, mezzo secondo dopo. Una seconda copia dello script è in esecuzione all'interno della prima. L'attesa originale(1) non verrà restituita fino al termine del secondo script. Se il secondo script chiude la finestra in cui si trova il pulsante, quale ambiente si trova attorno allo script originale? (non lo stesso di prima dell'attesa!) Non creare script che richiedono l'attesa senza una buona ragione; la maggior parte delle volte displaybox<<