Interrompre une boucle plus proprement que Doevents [Résolu]

Messages postés
34
Date d'inscription
jeudi 18 février 2010
Dernière intervention
23 juillet 2010
- - Dernière réponse : Feanor06
Messages postés
34
Date d'inscription
jeudi 18 février 2010
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
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
3
Merci
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)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 95 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
3
Merci
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)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 95 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
34
Date d'inscription
jeudi 18 février 2010
Dernière intervention
23 juillet 2010
0
Merci
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 !
Commenter la réponse de Feanor06
Messages postés
34
Date d'inscription
jeudi 18 février 2010
Dernière intervention
23 juillet 2010
0
Merci
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 !
Commenter la réponse de Feanor06
Messages postés
34
Date d'inscription
jeudi 18 février 2010
Dernière intervention
23 juillet 2010
0
Merci
Ah oui, parfait le petit message, très bonne idée !!!

Merci beaucoup Jack !
Commenter la réponse de Feanor06

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.