Hallo zusammen. Ich habe ein Fenster mit einem Fortschrittsbalken und einer Schaltfläche "Abbrechen" erstellt. Die Absicht besteht darin, dem Benutzer zu ermöglichen, die Programmausführung zu stoppen. Ich erhalte jedoch eine Fehlermeldung, wenn ich auf Abbrechen drücke, und weiß nicht, wie ich sie beheben kann. Eine vereinfachte Version meines Skripts ist unten.
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
);Wenn ich während der Schleife auf Abbrechen drücke, erhalte ich die folgende Fehlermeldung:
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);
) /*###*/;Wenn die Abbrechen-Schaltfläche gedrückt wird, gehe ich davon aus, dass sich das Fortschrittsfenster schließt und dann die Ausführung stoppt. Aber es scheint für mindestens eine Iteration fortgesetzt zu werden und schlägt an der Zeile SB_L << Size() in der For-Schleife fehl. Es schlägt fehl, weil das Fortschrittsfenster geschlossen und SB_L gelöscht wurde, aber ich bin verwirrt, warum diese Zeile ausgeführt wird, wenn der Befehl Stop () ausgegeben wurde?
Liege ich richtig, dass die Programmausführung auch nach meinem Stop()-Befehl fortgesetzt wird? Wie kann ich die Ausführung des Befehls SB_L << Size() verhindern, nachdem die Schaltfläche Abbrechen gedrückt wurde?
Einzelheiten:
JMP Pro 15.2.1
Mac OS Big Sur v11.6
Vielen Dank.
Danke Ryan (und Craige). Dies war eine Option, die ich definitiv in Betracht ziehe, aber dafür muss ein Flag an eine if-Klausel im Hauptskriptkörper gesendet werden. Mein Wunsch ist es, die Programmausführung einfach mit dem Befehl Stop() in der Schaltfläche Abbrechen zu stoppen. Vielleicht kann ich meine Frage neu formulieren: Warum scheint mein Stop()-Befehl die Ausführung nicht zu stoppen?
Habe gerade noch was interessantes bemerkt. Wenn ich den Befehl "pwin << Fenster schließen()" im Skript der Schaltfläche "Abbrechen" auskommentiere, stoppt die Schaltfläche "Abbrechen" die Ausführung nicht mehr. Es scheint, dass der Befehl Stop() die For-Schleife nicht stoppen kann, wenn sie über eine Schaltfläche ausgeführt wird. Die Schaltfläche "Abbrechen" konnte die Ausführung zuvor nur stoppen, weil das Entfernen des Fensters einen Fehler verursachte.
wait( n ) ist ein notwendiges Übel in JMP, das nach Möglichkeit vermieden werden sollte. Während eines Wait wird das Skript, das Wait aufruft, angehalten, während das Betriebssystem Dinge tun kann, wie z. B. das Erkennen eines Klicks oder das Sichtbarmachen eines geöffneten Fensters. Seltsame Dinge können passieren, weil Sie mit dem Klick ein anderes Skript (Ihr Beispiel) starten können, das die Umgebung des ersten Skripts berührt. In Ihrem Beispiel stoppt stop() das zweite Skript. Es kann auch ein globales Flag setzen. Wenn Ihr Projekt groß genug ist, um sich Gedanken über die Verfolgung globaler Variablen zu machen, können Sie auch Namensräume verwenden.
Also, was ist das Seltsame, was passieren kann? Meistens werden Fenster geschlossen oder Displayboxen gelöscht. Stellen Sie sich insbesondere eine Klickfunktion vor, die ein Skript hat, das wait(1) verwendet, und Sie klicken eine halbe Sekunde später erneut auf die Schaltfläche. Eine zweite Kopie des Skripts wird innerhalb der ersten ausgeführt. Das ursprüngliche wait(1) kehrt erst zurück, wenn das zweite Skript beendet ist. Wenn das zweite Skript das Fenster schließt, in dem sich die Schaltfläche befindet, in welcher Umgebung befindet sich das ursprüngliche Skript? (nicht dasselbe wie vor dem Warten!) Erstellen Sie keine Skripte, die ohne guten Grund warten müssen; meistens ist displaybox<<