cs_berthy
Messages postés2Date d'inscriptionjeudi 20 novembre 2003StatutMembreDernière intervention28 novembre 2008
-
28 nov. 2008 à 14:13
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDerniè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...
jmenfous
Messages postés117Date d'inscriptionmardi 21 janvier 2003StatutMembreDernière intervention 2 juillet 20091 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).
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 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