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 :

Problème de delegate


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut Problème de delegate
    Bonjour,

    j'ai une tâche multithread qui doit faire une écriture dans un listeview
    mais je comprend pas pk mon lv a un invoke.required = true

    voici mon code


    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    'Au debut de la classe 
    Delegate Sub UIOneArgSub(ByVal Msg As String)
    Dim DelRecLVStat As UIOneArgSub
     
    'Dans mon sub 
    Dim Msg As String = (r.Item(0) & ";" & r.Item(1) & ";" & r.Item(2) & ";" & r.Item(3))
                DelLVStat(Msg)
     
     
    Sub DelLVStat(ByVal msg As String)
            If Not LVStat2.InvokeRequired Then
                Dim MaStr() As String
                MaStr = msg.Split(";")
                Dim LVI As New ListViewItem
                LVI.UseItemStyleForSubItems = False
                LVI.Text = MaStr(0)
                LVI.SubItems.Add(MaStr(1))
                LVI.SubItems.Add(MaStr(2))
                LVI.SubItems.Add(MaStr(3))
                LVStat2.Items.Add(LVI)
            Else
                DelRecLVStat = New UIOneArgSub(AddressOf DelLVStat)
                Me.BeginInvoke(DelRecLVStat, New Object() {msg})
            End If
        End Sub
    pourtant dans une autre form la sequense fonctionne bien

    merci de vos suggestions

    Mario

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    Désolé le problème était au niveau de la déclararion des threads.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    Ouaie bien quelqu'un peut-il m'expliquer pk lorsque je mais un .join à mes threads mon delegate ne fonctionne plus, et sans le .join ça fonctionne bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For i = 0 To 10
                Dim T As New Threading.Thread(AddressOf DoTheTask2)
                T.Name = "Thread#" & i.ToString
                ObjDataSetEtFin.Tables.Add(T.Name)
                MiseEnForme(ObjDataSetEtFin.Tables(T.Name), "EtFin")
                T.Start(T.Name)
                T.Join()
            Next
    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
    Sub DoTheTask2(ByVal thr As String)
            SyncLock (Lock)
                Do Until QuTor.Count = 0
                    Dim Symb As String = QuTor.Dequeue
                    CreerDataTable2(Symb, "T", thr)
                    ObjDataSetEtFin.Tables(thr).Dispose()
                    ObjDataSetEtFin.Tables(thr).Rows.Clear()
                    My.Application.DoEvents()
                Loop
    etc.
    Sub CreerDataTable2(ByVal symb As String, ByVal Brs As String, ByVal thr As String)
    ...
     Dim Msg As String = String.Format("{0};{1};{2};{3}", symb, CrRev, CrBen, CrCap)
            DelLVStat(Msg)
    ...
    end sub
    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
    Sub DelLVStat(ByVal msg As String)
            If Not LVStat2.InvokeRequired Then
                Dim MaStr() As String
                MaStr = msg.Split(";")
                Dim LVI As New ListViewItem
                LVI.UseItemStyleForSubItems = False
                LVI.Text = MaStr(0)
                LVI.SubItems.Add(MaStr(1))
                LVI.SubItems.Add(MaStr(2))
                LVI.SubItems.Add(MaStr(3))
                LVStat2.Items.Add(LVI)
            Else
                DelRecLVStat = New UIOneArgSub(AddressOf DelLVStat)
                Me.BeginInvoke(DelRecLVStat, New Object() {msg})
            End If
    merci

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    le multithreading est quelque chose qui peut etre complexe
    ce que vous en faites me semble étrange à première vue

    il faut éviter les .join sur le thread principal (et tout ce qui peut durer plus d'une seconde de manière générale)
    il faut éviter application.doevents, ca montre en général une mauvaise construction
    et avec un synclock dessus ca doit pouvoir mener à un deadlock ^^

    ca ressemble à du code improvisé, et avec un mauvais paramétrage de vs (il faut activer option strict on par exemple)

    tu as essayé le backgroundworker ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    Oui J'ai essayé le backgroudWorker mais je recherche une solution qui peut faire plusieurs fois la même routine avec des paramaitre différant.

    Je viens d'activer option strict j'ai beaucooup de correction à faire alors je reviendrai la dessus plus tart.

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    Citation Envoyé par Mario Rousson Voir le message
    Oui J'ai essayé le backgroudWorker mais je recherche une solution qui peut faire plusieurs fois la même routine avec des paramaitre différant.
    le backgroundworker n'est qu'un thread encapsulé avec tout ce qui est utile (mise à jour de l'UI, cancellation pré cablée etc...) donc souvent plus pratique pour les débutants
    tout ce qu'on peut faire avec un thread, on peut le faire avec le backgroundworker

    Citation Envoyé par Mario Rousson Voir le message
    Je viens d'activer option strict j'ai beaucooup de correction à faire alors je reviendrai la dessus plus tart.
    à faire quand même
    ca évite parfois de passer 3 jours à cherche un bug 6 mois après
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/11/2007, 09h36
  2. [Mono] Problème de delegate
    Par goddet dans le forum Mono
    Réponses: 6
    Dernier message: 13/09/2007, 17h07
  3. [C#][Thread][Invoke] petit problème de delegate
    Par clinic dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 22/06/2007, 11h38
  4. [C++/CLI] problème avec Timer ou delegate
    Par breezer911 dans le forum Visual C++
    Réponses: 1
    Dernier message: 11/04/2007, 15h27
  5. Réponses: 1
    Dernier message: 24/11/2006, 16h36

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