Salut tout le monde. J'ai créé une fenêtre avec une barre de progression et un bouton "Annuler". L'intention est de permettre à l'utilisateur d'arrêter l'exécution du programme. Cependant, j'obtiens une erreur lorsque j'appuie sur annuler et je ne sais pas comment la résoudre. Une version simplifiée de mon script est ci-dessous.
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 j'appuie sur Annuler pendant que la boucle est en cours d'exécution, j'obtiens l'erreur suivante :
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);
) /*###*/;Lorsque le bouton d'annulation est enfoncé, je m'attends à ce que la fenêtre de progression se ferme, puis l'exécution s'arrête. Mais il semble continuer pendant au moins une itération et échoue à la ligne SB_L << Size() dans la boucle For. Cela échoue car la fenêtre de progression s'est fermée et SB_L a été supprimé, mais je ne comprends pas pourquoi cette ligne est exécutée si la commande Stop() a été émise ?
Ai-je raison de dire que l'exécution du programme se poursuit même après ma commande Stop() ? Comment puis-je empêcher l'exécution de la commande SB_L << Size() après avoir appuyé sur le bouton Annuler ?
Des détails:
JMP Pro 15.2.1
Mac OS Big Sur v11.6
Merci.
salut @nikles . Vous voudrez peut-être consulter cet article récent de @Craige_Hales , Barre de progression avec bouton Annuler .
Merci Ryan (et Craige). C'était une option que j'envisageais définitivement, mais cela nécessite l'envoi d'un indicateur à une clause if dans le corps du script principal. Mon souhait est simplement d'arrêter l'exécution du programme à l'aide de la commande Stop() du bouton Annuler. Peut-être que je peux reformuler ma question : pourquoi ma commande Stop() ne semble-t-elle pas arrêter l'exécution ?
Je viens de remarquer autre chose d'intéressant. Si je commente la commande "pwin << Fermer la fenêtre()" dans le script du bouton Annuler, le bouton Annuler n'arrête plus l'exécution. Il semble que la commande Stop() ne soit pas capable d'arrêter la boucle For lorsqu'elle est exécutée à partir d'un bouton. Le bouton Annuler n'a pu arrêter l'exécution auparavant que parce que la suppression de la fenêtre a créé une erreur.
wait( n ) est un mal nécessaire dans JMP, à éviter dans la mesure du possible. Pendant une attente, le script qui appelle l'attente est mis en pause pendant que le système d'exploitation peut faire des choses, comme reconnaître un clic ou rendre visible une fenêtre ouverte. Des choses étranges peuvent arriver, car vous pouvez utiliser le clic pour démarrer un autre script (votre exemple) qui touche l'environnement du premier script. Dans votre exemple, stop() arrête le deuxième script. Il peut également définir un indicateur global. Si votre projet est suffisamment important pour vous soucier du suivi des variables globales, vous pouvez également utiliser des espaces de noms.
Alors, quelle est la chose étrange qui peut arriver? Principalement des fenêtres fermées ou des boîtes d'affichage supprimées. En particulier, imaginez une fonction de clic qui a un script qui utilise wait(1), et vous cliquez à nouveau sur le bouton, une demi-seconde plus tard. Une deuxième copie du script s'exécute à l'intérieur de la première. Le wait(1) d'origine ne reviendra qu'à la fin du second script. Si le deuxième script ferme la fenêtre dans laquelle se trouve le bouton, quel environnement entoure le script d'origine ? (pas le même qu'avant l'attente !) Ne construisez pas de scripts qui nécessitent une attente sans une bonne raison ; la plupart du temps displaybox<<