Arreter et sortir de fonctions : un 'Master Stop'...

tcholleybus Messages postés 4 Date d'inscription mercredi 15 février 2006 Statut Membre Dernière intervention 12 avril 2007 - 11 avril 2007 à 15:13
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 12 avril 2007 à 15:38
Bonjour à tous!

J'ai actuellement besoin de vos lumières:
Je lance une 'Sub' après avoir cliqué sur un bouton. Elle effectue une communication vers 2 appareils de mesure via COM1-2. Cette fonction peut durer des heures et peut contenir des centaines de commandes/réponses à traiter... De plus cette fonction apelle d'autre fonctions...

ma question : j'aimerais pouvoir arrêter cette fonction et celles auxquelles elle fait appel en cliquant sur un autre bouton... une sorte de 'master stop' ou master interrupt, qui me ferait sortir de toutes les fonctions en cours....
Je ne veux pas de tests sur un flag dans mes fonctions, c'est irréalisable et très 'bricolage' comme solution....

Y'en a-t-il une autre?.... MERCI d'avance!!!

9 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
11 avril 2007 à 15:34
dépend de la structure de tes appels...
tu n'a peut etre pas trop de fonctions dans lesquels tu devra tester ton flag

car il te faudra passer par un flag.

autre solution, faire de ton long traitement un exe a part
tu n'aura qu'a le lancer, et a le fermer (ou crasher) quand tu n'en aura plus besoin.
0
tcholleybus Messages postés 4 Date d'inscription mercredi 15 février 2006 Statut Membre Dernière intervention 12 avril 2007
11 avril 2007 à 15:57
merci pour la réponse!

Comme tu dis, ça dépend de la 'profondeur' de mon code... mais mon problème c'est que je n'ai pas envie de prévoir à chaque étage, entre chaque commande un test du flag pour interrompre la fonction en cous et remonter vers la fonction 'supérieure' pour la stopper, etc...

Et puis un 'crash' de mon programme, çe ne le fait pas non plus, car j'aimerais le stopper, pour éventuellement le reprendre plus tard (du style le soir-matin) sans perdre les valeurs déja acquises...

mais bon, si il n'y a pas d'autres solutions...

je programme souvent en assembleur, et là, pas de problème, je travail en cyclique, et je peux gèrer 1'000 interruptions/stop/restart/etc sans problème...

qq'un a une autre idée?
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
11 avril 2007 à 16:17
Et faire uniquement un test de ce flag sur les premiers niveaux d'imbrications, et donc attendre qques secondes avant que la fonction s'arrête réellement c'est impossible ?

Sinon c'est bête, mais j'imagine que si tu penses à cliquer sur un bouton pendant le déroulement de ta fonction, c'est que tu as mis pas mal de DoEvents dans ton code non ?

Donc tu pourrais faire une procédure à toi style :

Function DoEventsAndCheckFlag() as boolean
   DoEvents()
   Return flag
End Function

Ensuite tu fais une recherche globale dans ton code en remplacant
DoEvents par If DoEventsAndCheckFlag Then Exit Sub

C'est moyen bricolage aussi mais bon ^^

<hr size="2" width="100%" />Julien.
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
11 avril 2007 à 19:19
Le conseil si tu utilises des loops vérifie une valeur booléenne que tu mettrais à la portée publique. Et avec le bouton change la valeru de la valeur booléenne.

Redman
0

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

Posez votre question
tcholleybus Messages postés 4 Date d'inscription mercredi 15 février 2006 Statut Membre Dernière intervention 12 avril 2007
12 avril 2007 à 09:24
C'est vrai que c'est le plus simple.... et que j'ai effectivement besoin de 'doevents' de toute façon...
merci pour vos idées!!

mais je suis un peu déçu quand même, je pensais vraiment qu'il y avait une possibilité d'interrompre une fonction en cours d'éxécution, autre que celle dans laquelle on se trouve....

On fera sans!....
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
12 avril 2007 à 11:27
Ben je te l'ai dit pour le faire. Il faut lire !

Redman
0
tcholleybus Messages postés 4 Date d'inscription mercredi 15 février 2006 Statut Membre Dernière intervention 12 avril 2007
12 avril 2007 à 11:41
Oui, j'ai bien compris ton explication, c'est d'ailleurs dans ce sens que je vais aller, pas d'autre choix...

Dans mon programme j'ai 3-4 boucle imbriquées, avec des 10aines d'appel à d'autres fonctions qui ont elles aussi 3-4 boucle, etc... Faut tester ce flag dans chaque boucle, ne pas oublier un p'tit recoin, etc... c'est un peu 'bricolage'....

Ce que je voulais, c'est pouvoir dire lors d'un click sur un bouton : "Arrête toutes les fonctions en cours, réinitialise-toi" une sorte de "Exit all Sub", ou un "End all Sub" sauf celle ou je suis actuellement....
Tu comprends mon idée?...
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
12 avril 2007 à 11:46
Oui je comprends. Tu peux mettre toutes tes boucles dans un threads et stopper le thread ou le redémarrer.

Redman
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
12 avril 2007 à 15:38
Oui bien sûr le multithreading serait l'idéal, mais il est en VB6, et en VB6, pas de multithreading...
A tout casser, fais une dll en un autre language qui se chargerait de faire un fork vers une procédure, puis de l'arrêter ^^.
Mais sinon pour en revenir aux boucles imbriquées, même si tu oublies les dernières imbrications, au pire l'utilisateur attendra quelques secondes avant que ça s'arrete réellement, mais est-ce grave ?

<hr size="2" width="100%" />Julien.
0
Rejoignez-nous