Interrompre une boucle plus proprement que Doevents

Résolu
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 juillet 2010 - 19 mars 2010 à 16:50
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 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)?

Merci beaucoup et très bon week-end à tous !

Soft : VB2008 Express sur XP

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
3
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 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...).

Merci encore et bonne continuation !
0
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 juillet 2010
20 mars 2010 à 15:52
Ah oui, parfait le petit message, très bonne idée !!!

Merci beaucoup Jack !
0
Rejoignez-nous