Stopper l'exécution d'une fonction

Signaler
Messages postés
2
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
28 novembre 2008
-
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
-
Bonjour à vous,

Dans le cadre de mon travail je suis parfois amené à développer des petites applications. Je suis avant tout ingénieur Hardware et je reste encore débutant en VB.net.

J'ai un souci dans le cadre d'une application que je développe en ce moment, j'ai déjà effectué quelques recherches mais je n'ai rien trouvé qui puisse m'aider. Je ne connais peut être pas le bons mots clé... Alors désolé d'avance si ma question est redondante ou ultra basique...

Voici mon souci dans les grandes lignes:
sur mon interface, l'appui sur un bouton "Start" lance une série de mesures (commande svers un oscilloscope et divers appareils de mesures). Ces mesures sont en réalité une série de fonctions et de boucles à l'intérieur de ces fonctions.
Ces mesures durent parfois plusieurs minutes.
Je souhaiterais donc pouvoir interrompre ces exécutions pour ramener le programme dans un état "neutre".
Par exemple dans une fonction de ce type:

    Private Sub t_Tick(ByVal sender As Object, ByVal e As EventArgs)
        Lbl_Date.Text = DateTime.Now.ToString("dddd d MMMM yyyy  h:mm:ss tt")
    End Sub

Malheureusement il semblerait que l'interface reste figée pendant ce temps, donc pas moyen par exemple d'appuyer sur un bouton "stop".

Existe t'il par exemple un système d'interruption comme dans le monde des microcontrôleurs... ?
Qui ferait que par l'appui d'une touche ou d'un bouton de l'interface, l'exécution en cours s'arreterait.

Pour le moment, le seul moyen de stopper la série de mesures est un bon "ctrl" "alt" "suppr", c'est pas très propre et pratique, car on perd tout les réglages et résultats.

Merci d'avance pour tout ce qui pourrait me mettre sur le voie...

5 réponses

Messages postés
117
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
2 juillet 2009
1
Une solution des plus simple consiste à utiliser le BackGroundWork. en gros c'est un contro qui te permet de lancer une méthode en mode asynchrone (ton interface reste alors accessible et peut être rafraichie ou utilisée). En plus il permet de faire remoter des informations sur l'état de l'opération en cours, et Saint Graal pour ton cas, d'interrompre une méthode en cours. Je t'encourages donc vivement à regarder dans la MSDN ce qu'il y a à ce suijet (les exemples y sont simple et claires).

Jérémy Jeanson
MCP
Messages postés
2
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
28 novembre 2008

Merci, je vais étudier ça alors .

Je vous tiens au courant si j'ai réussi à faire ce que je souhaite.
Messages postés
14770
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 février 2021
151
Bonjour,

Sinon, il y a plus simple, mais moins propre : DoEvents, mais l'idéal, dans ton cas, c'est les threads évidemment.

http://nhen0039.chez-alice.fr/index.php
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Alors reprenons les choses dans l'ordre.

Si ton interface est figée, c'est bien parce que la ou les boucles dans tes fonctions accapare tout le temps processeur et que ce dernier ne peut plus traiter ce qu'il y a à coté.

L'espèce d'interruption dont tu parle existe bien à quelque chose près, ça s'appelle un évènement. Par exemple lorsque tu clique sur ton bouton, l'évènement Click de ce bouton est déclenché et tu peux ainsi réagir à ce click.
Sauf qu'ici du fait de tes boucles ne laissent pas le temps au processeur de venir traiter cet évènement.

Les solutions peuvent effectivement etre :
- Inserer quelques Application.DoEvents dans tes boucles. Cette instruction indique au processeur d'aller traiter les évènements en attente (entre-autre) avant de continuer. 
-  mettre le traitement lourd dans autre thread (pour faire simple, sorte de petit programme à l'intérieur de ton programme). Comme tes boucles ne vont bloquer que ce thread là, et laisseront libre le thread principal. Ton interface (qui est sur le thread principal) ne sera pas figée.

Ma réponse n'apporte rien de plus si ce n'est quelques explication aux solutions qui t'ont été données

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
Salut,
Moi aussi je dirais sans hésiter d'utiliser un 2ème thread..
Par contre ce n'est pas BackGroundWork mais BackgroundWorker:
Private WithEvents BackWorker As New System.ComponentModel.BackgroundWorker

http://msdn.microsoft.com/fr-fr/library/c8dcext2(VS.80).aspx