Stopper l'exécution d'une fonction

cs_berthy Messages postés 2 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 28 novembre 2008 - 28 nov. 2008 à 14:13
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 - 29 nov. 2008 à 01:26
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

jmenfous Messages postés 117 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 2 juillet 2009 1
28 nov. 2008 à 14:29
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
0
cs_berthy Messages postés 2 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 28 novembre 2008
28 nov. 2008 à 14:37
Merci, je vais étudier ça alors .

Je vous tiens au courant si j'ai réussi à faire ce que je souhaite.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
28 nov. 2008 à 15:27
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
28 nov. 2008 à 17:53
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
0

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

Posez votre question
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
29 nov. 2008 à 01:26
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
0
Rejoignez-nous