Feanor06
Messages postés34Date d'inscriptionjeudi 18 février 2010StatutMembreDernière intervention23 juillet 2010
-
19 mars 2010 à 16:50
Feanor06
Messages postés34Date d'inscriptionjeudi 18 février 2010StatutMembreDernière intervention23 juillet 2010
-
20 mars 2010 à 15:52
Bonjour,
Bon, désolé d'avance si je ne suis pas dans le bon Thème...
Je cherche en fait le moyen de faire une interruption propre.
Je fais du traitement d'image avec une caméra CCD. Toute la configuration et la récupération des informations est assez longue et j'aimerai pouvoir l'interrompre.
J'ai inséré un "Doevents" dans le plus bas niveau de mes boucles et un bouton STOP qui agit sur une variable qui gère un "Exit Sub" sur un "If True".
Ça fonctionne mais pas bien, il faut appuyer plusieurs fois sur le bouton STOP pour que le prog rende enfin la main.
Existe t'il une interruption ultime qui peut tout arrêter en un coup ?
Ou alors, faute de mieux, au moins lancer un Exit directement du Doevents, sans passer par une variable et un étage de test, style : Doevents(Exit)?
cs_Jack
Messages postés14007Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 19 mars 2010 à 20:07
Salut
si si, c'est la bonne catégorie.
Un DoEvents ne fait que redonner la main au système pour gérer ses évènements, comme l'appui sur ton bouton Stop pour activer ta variable.
Tester ta variable de Stop est la bonne solution, sauf qu'il faut la tester à chaque fois que tu estimes que tu peux interrompre ton traitement.
Si tu n'as mis qu'un seul test de Stop dans ta procédure, il faudra que le programme y arrive pour l'exécuter, logique.
Alors oui, ton DoEvents accompagné du test de Stop, tu peux le mettre dans une Fonction perso, mais il te faudra quand même faire un test du résultat de la fonction perso.
Pas beaucoup d'intérêt.
Faut bien penser que ce n'est pas le DoEvents qui te permet de stopper ton programme, mais il permet à ton bouton Stop d'avoir la main pour activer ta variable qui sera testée dans ton programme.
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_Jack
Messages postés14007Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 20 mars 2010 à 14:49
La multiplication des DoEvents permettra de diminuer le temps de latence entre l'action sur le bouton et le code qu'il renferme (la mise à True de ta variable Stop)
Inconvénient majeur : ça ralentira le programme.
Mais le programme ne s'arrêtera réellement que lorsque ton programme testera cette variable Stop.
Donc, pour être bien, il faut autant de DoEvents que de test.
Je ne sais pas ce que tu lances dans ta Sub, mais si la latence est dûe au temps de réponse d'un équipement, tu ne peux rien faire dans le programme pour l'interrompre puisque le délai ne dépend pas de lui.
Pour l'histoire de la function, elle n'apporte rien :
Sans fonction :
Application.DoEvents
If maVarStop Then Exit Sub
Avec fonction :
If maFonction Then Exit Sub
et, dans la fonction :
Private Function maFonction() As Boolean
Application.DoEvents
maFonction = maVarStop
End Function
Perso, en tel cas de figure, dès que maVarStop est activée, j'affiche un message (Label ou caption du bouton) avec "arrêt demandé". Ca permet à l'utilisateur de savoir que son ordre a été pris en compte mais qu'il faut qu'il patiente le temps que le programme s'interrompt réellement.
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Feanor06
Messages postés34Date d'inscriptionjeudi 18 février 2010StatutMembreDernière intervention23 juillet 2010 20 mars 2010 à 10:44
Ok, merci beaucoup Jack !
C'est ce que j'ai fait, j'en ai mis partout et c'est vrai que ça répond un peu mieux, toujours quelques secondes de batement mais bon, ça va, et un clic suffit.
Dommage qu'il n'existe pas un équivalent à Doevents qui lance une fonction direct (pour mon cas un Exit...).
Feanor06
Messages postés34Date d'inscriptionjeudi 18 février 2010StatutMembreDernière intervention23 juillet 2010 20 mars 2010 à 10:48
Une dernière chose, est-ce qu'il est possible de tuer un Sub à l'extérieur ce celui-ci ? Ça pourrait être plus propre de faire un Exit Sub dans mon bouton Stop... Par contre je ne voit pas comment faire un Exit Sub(MaFonction)... Parce que sinon, à part tuer le mon bouton, ça ne va pas faire grand chose...
Merci !
Vous n’avez pas trouvé la réponse que vous recherchez ?