Arreter et sortir de fonctions : un 'Master Stop'...
tcholleybus
Messages postés4Date d'inscriptionmercredi 15 février 2006StatutMembreDernière intervention12 avril 2007
-
11 avril 2007 à 15:13
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDerniè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!!!
A voir également:
Arreter et sortir de fonctions : un 'Master Stop'...
tcholleybus
Messages postés4Date d'inscriptionmercredi 15 février 2006StatutMembreDernière intervention12 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...
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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
OneHacker
Messages postés1447Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention23 septembre 20072 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
tcholleybus
Messages postés4Date d'inscriptionmercredi 15 février 2006StatutMembreDernière intervention12 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....
tcholleybus
Messages postés4Date d'inscriptionmercredi 15 février 2006StatutMembreDernière intervention12 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?...
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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 ?