Quand utiliser Wait(0) ?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Salut tout le monde,
J'ai une question concernant la meilleure pratique concernant l'utilisation de la commande 'Wait (0)' dans un script JSL.
Je suppose qu'il y a des moments où votre script peut prendre de l'avance en termes d'exécution de code avant qu'une opération précédemment scriptée ne soit terminée, et mettre une commande wait(x) après de telles opérations est une façon d'essayer de s'assurer que l'opération se termine avant de continuer avec votre scénario.
Je me demande juste quand devriez-vous vous en préoccuper? Par exemple, si je divise une table de données, ai-je besoin d'un wait(0) ? Que diriez-vous d'envoyer un message '<
De plus, quelle est la meilleure pratique lorsqu'il s'agit d'utiliser un Wait(0) ? Je sais que dans le cas d'attendre que les formules soient évaluées dans un dt, vous seriez mieux servi en envoyant un message '<< Run Formulas' à une table de données au lieu d'utiliser un wait(0), mais ce n'est pas si clair dans d'autres circonstances.
Toutes mes excuses si cela semble être une discussion plutôt large/vague. Cela vient du fait que j'essaie d'améliorer le temps d'exécution d'un script que j'ai, et le profileur dit que beaucoup de temps est passé sur ces commandes d'attente que j'ai insérées après le type d'opérations mentionnées ci-dessus . J'apprécie toute idée à ce sujet ou s'il existe des ressources disponibles que je peux consulter, encore mieux. Acclamations!
Re : Quand utiliser Wait(0) ?En plus d'utiliser l'espace de noms Here, par exemple Here:myVar
Re : Quand utiliser Wait(0) ?Vous voulez probablement que cette case soit cochée.L'utilisation de l'espace de noms Here n'est qu'un bon codage et je vous encourage à commencer tous vos scripts avec 'Names Default to Here(1);' Si vous n'utilisez pas l'espace de noms ici (ou un espace de noms de votre choix), JMP affectera tout en tant que variables globales.Pour les tests et le code personnel, ce n'est pas un gros problème, mais si vous mettez un script dans un complément, je suppose qu'il sera utilisé pour la production.
L'utilisation de l'espace de noms global posera sûrement un problème pour les scripts de production.Le problème le plus courant est le remplacement involontaire de variables communes, telles que "dt" ou "datatable".D'autres problèmes impliquent l'exécution de deux scripts ou compléments en même temps.Par exemple, les deux peuvent avoir des boucles For(), et puisque la variable "i" est couramment utilisée pour les boucles For(), et "j" pour les boucles For() intégrées si elles commencent toutes les deux à s'exécuter, vous pouvez vous retrouver à exécuter une boucle infinie boucle où "i" continue d'être modifié par les deux scripts différents.
L'utilisation de l'espace de noms Here évite ces problèmes puisque chaque script se voit attribuer un espace de noms temporaire tant que le script est ouvert ou en cours d'exécution.Ainsi, "i" est local au script et vous n'aurez pas à vous soucier des réaffectations accidentelles.
Il existe environ un million de façons de résoudre votre problème de boîte à boutons tout en utilisant l'espace de noms Here.Définir certains noms de variables robustes comme globaux que le bouton peut utiliser.Définir et utiliser votre propre espace de noms (vous n'avez donc pas à trouver un nom de variable robuste).Redéfinir les variables clés dans le script de la boîte à boutons afin qu'elles soient réaffectées lorsque le bouton est enfoncé.En utilisant << Modal.Utilisation de Schedule().Stockage des variables dans une table de données. etc. etc.
Re : Quand utiliser Wait(0) ?Suivi.J'ai été trompé ici sur le timing.Il s'avère qu'il y a cette case à cocher étrange dans l'assistant Addin : "Utiliser le Ici espace de noms pour les noms de variables JSL non qualifiés".Décochez-la et mes problèmes ont disparu.Cela explique pourquoi mon JRN n'exécuterait pas le JSL dans sa ButtonBox.-dj
Re : Quand utiliser Wait(0) ?J'ai vu cela dans le passé, par exemple de la migration de JMP8 vers JMP9, certains de mes scripts ne fonctionnaient pas car JMP9 s'exécutait trop rapidement.Si je me souviens bien, j'ai placé dans une certaine attente (0); et tout allait bien.
Maintenant, j'ai un nouveau cas de problème de synchronisation, très étrange mais réel:
script : JRN avec ButtonBoxes.Chaque ButtonBox exécute un JSL.
Cas 1 : bon cas - si j'ouvre le JRN via l'Explorateur Windows dans JMP, le JSL suivant fonctionne correctement.
Cas 2 : Mauvais cas - si j'ouvre le menu JRN en tant que complément JMP, cela ne fonctionne pas.Le journal semble afficher des boîtes d'affichage inconnues (qui sont contenues dans JSL à divers endroits).De plus, si je regarde juste ces deux cas, le cas 2 s'exécute plus rapidement que le cas 1, même à mes yeux !Et non, dans ce cas, toutes les références de fichiers sont correctes, les deux cas utilisent exactement les mêmes JRN/JSL sur mon PC local, et même la façon dont je lui dis de s'ouvrir dans le complément JMP ne fait aucune différence (si "path"> $ADDIN_HOME vs "texte">ouvrir).
Donc, dans mon cas, il semble que même la façon dont JMP charge les choses peut avoir une incidence sur le timing.Je pense que dans mon cas 2 ci-dessus, JMP est juste capable de charger mon JRN et les scripts suivants beaucoup plus rapidement, mais cela affecte malheureusement le timing de manière négative.Quoi qu'il en soit, mon approche consistera à essayer un peu d'attente (0); est de voir si je peux ralentir un peu JMP.bravo, dj
Re : Quand utiliser Wait(0) ?" il semble que vous n'ayez qu'à rencontrer certains problèmes avant de savoir quand c'est nécessaire" ... Je suis d'accord avec ça.L'utilisation inutile d'une attente ralentira votre code.Je ne l'utilise que si mon code échoue et que Wait est le seul moyen de le réparer.
J'ai fait une recherche rapide sur mon code et voici quelques exemples - ils concernent tous les interactions avec les fenêtres.Je n'ai trouvé aucun exemple où les tâches JMP principales telles que les manipulations de table nécessitaient une attente.
Exemple 1 : mise à jour d'une zone de texte (ou d'une autre zone d'affichage)
Effectuer une tâche de calcul intensif (boucle) et vouloir transmettre des informations à l'utilisateur - vous devez donner à Windows un peu de temps pour effectuer l'actualisation (alternativement, dans cet exemple, un message "reshow" pourrait être envoyé à la fenêtre contenant la zone de texte )
tbEstimation << Définir le texte ( "Délai d'achèvement estimé = " || Carboniser ( temps estimé ) || "secondes" ) ;
Attendez ( 0 )
Exemple 2 : Utilisation de StatusMsg
StatusMsg a été inventé avant que nous ayons l'interface multidocument pour JMP et il est donc imprévisible quelle fenêtre est utilisée pour afficher le message.L'utilisation d'une attente garantit que vous avez l'attention de Windows actuelle
Attendez ( 0 ) ;
strMessage = "Quelque message" ;
StatusMsg ( strMessage ) ;
Exemple 3 : mise à jour dynamique du contenu
Pas strictement nécessaire mais peut aider à réduire le scintillement
( ici : vlb << Enfant ) << Supprimer ;
Attendez ( 0 ) ;
ici : vlb << Ajouter( contenu )
Où vlb est une V List Box ou un autre conteneur de boîte d'affichage
-Dave
Re : Quand utiliser Wait(0) ?dans cet exemple, wait(0) est nécessaire après avoir déclenché une action depuis le menu principal pour obtenir la bonne table référencée par la table de données actuelle() :
https://community.jmp.com/t5/Discussions/run-table-script/mp/755152/highlight/true#M93767
Re : Quand utiliser Wait(0) ?message supprimer