IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Multithread et delegate


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 18
    Par défaut Multithread et delegate
    Bonjour,

    J'essaie de me mettre à VB.NET et je m’aperçois d’emblée que c'est la galère, et pourtant j'arrivais à faire de petites choses en VB6

    J'essaye d'écrire une application pour communiquer avec une carte Microcontroleurs (à base de PIC) à travers le port série.

    j'ai fait des essais avec le port série et ça marche très bien. J'arrive à envoyer et recevoir des données vers le PIC. Je me suis planté sur quelque chose qui semble pourtant très simple,

    Voila ce que m'aiderait à réaliser mon application:

    un petit programme avec une interface qui contient un bouton (Start/Stop) et un TextBox
    - Si on clique sur le bouton, on voie un Compteur s'incrémenter dans le TextBox
    - Si on appui de nouveau sur le bouton, le compteur s’arrête

    Merci beaucoup,

  2. #2
    xeo
    xeo est déconnecté
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 42
    Par défaut
    j'ai été moi meme confronté a ca il y a quelques mois et j'ai trouvé un moyen de contourner le probleme...

    j'utilisais un backgroundworker pour lancer une tache cyclique qui ne fige pas ma form.

    ma tache cyclique était donc réaliser dans l'évenement doWork de mon backgroundworker et forcément tu as le droit a une belle erreur quand tu essaies de mettre a jour tes composants de ta form dans cet évenement.

    bref le code ci-dessous ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
     
    label1.text = "ca marche pas"        
     
    End Sub
    en cherchant, j'ai donc vu comme toi qu'il fallait passer par des delegates, j'ai tester et ca fonctionnait mais je trouve franchement que c'est ultra compliqué pour faire un truc finalement si simple..............

    j'ai donc trouvé une méthode bien plus simple a mettre en oeuvre, je passe par des variables public et je mets a jour ma form dans l'évenement "RunWorkerCompleted".

    bref le code ci-dessous fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public montexte as string
     
    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
     
    montexte = "ca marche"        
     
    End Sub
     
     
    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
     
    label1.text = montexte
     
    BackgroundWorker1.RunWorkerAsync()
     
    End Sub
    je ne sais pas si mon code est fait dans les règles de l'art du petit développeur mais en tout cas ca fonctionne tres bien et c'est bcp plus simple que l'utilisation des delegates....

    PS : je suis curieux de voir ton prog de com via le port série et surtout le codage du CRC

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 18
    Par défaut
    Merci xeo, je vais essayer ça.

    Pour le reste de l'application avec le port série, je la publierais dès que j'ai quelque chose de complet qui marche bien.

    A+

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2010
    Messages : 132
    Par défaut
    Les backgroundworker (BGW) c'est bien, et la fonction BGW.reportprogress est utile, mais tu peux parfois rencontrer des limitations pour lesquelles il te faudra des delegates.

    Pour l'exemple, j'ai mis un NumericUpDown (NUD) sur un formulaire et j'ai fait un BGW qui compte jusqu'a 10000 en affichant les valeurs dans le NUD
    Si tu appeles la fonction ci dessous depuis un BGW tu auras une exception "Cross thread blah blah...":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Public Function IncrementNum()
            NumericUpDown1.Value += 1
        End Function
    Alors que si tu appeles celle là, ca marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Private Delegate Sub IncrementNumDelegate()
        Public Sub IncrementNum()
            If InvokeRequired Then
                Dim D As New IncrementNumDelegate(AddressOf IncrementNum)
                BeginInvoke(D)
            Else
                NumericUpDown1.Value += 1
                NumericUpDown1.Refresh() 'Tu peux avoir besoin de ca pour que les valeurs s'actualisent
            End If
        End Sub
    Tu peux faire avec des Function au lieu de Sub, et tu peux passer des arguments si tu veux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Private Delegate Sub IncrementNumDelegate(ByVal NewValue As Integer)
        Public Sub IncrementNum(ByVal NewValue As Integer)
            If InvokeRequired Then
                Dim D As New IncrementNumDelegate(AddressOf IncrementNum)
                BeginInvoke(D, NewValue)
            Else
                NumericUpDown1.Value = NewValue
            End If
        End Sub
    Bon code

Discussions similaires

  1. [Kylix] Multithreads la galère
    Par Oyoboy dans le forum EDI
    Réponses: 16
    Dernier message: 16/07/2004, 11h03
  2. [WinAPI C++] MultiThreading et PostMessage
    Par Gruik dans le forum Windows
    Réponses: 7
    Dernier message: 29/03/2004, 15h58
  3. [WinAPI C++] MultiThreading?
    Par Gruik dans le forum Windows
    Réponses: 2
    Dernier message: 25/03/2004, 00h08
  4. [Win32]App multithread
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 25/09/2003, 09h57
  5. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo