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 :

Erreur context switch deadlock


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 143
    Par défaut Erreur context switch deadlock
    Bonjour à tout le monde.

    Il m'est arrivé à 2 reprises déjà de me buter à cette erreur de context switch deadlock, et à chaque fois elle me laisse toujours aussi perplexe. De ce que j'ai pu remarquer elle survient lorsque j'écris des codes qui appellent des fonctions qui elles aussi appelent des fonctions, qui appellent des fonctions, qui appellent des fonctions.....
    Toutefois je ne saurais me passer de ces diverses fonctions. J'ai lu qu'on peut résoudre ça en utilisant des threads, mais ça me semble assez complexe et pas conseillé d'utiliser par quelqu'un qui n'en a pas la maitrise complète.Quelqu'un connaitrait-il une autre solution à ce prolème de context switch deadlock?

    Merci

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 310
    Par défaut
    Et hop ^^ J'ai déjà eu le même problème

    http://www.developpez.net/forums/d88...witchdeadlock/

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    un deadlock ne peut se produire qu'en multithreading, donc tu es déjà en multithreading
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 143
    Par défaut
    J'ai mis un Aplication.doevents() après chaque appel de ces nombreuses fonctions dont je parlais. certes l'erreur ne s'affiche plus, mais l'éxécution est toujours aussi longue. Pourtant j'ai déja écrit des programmes beaucoup plus longs qui s'éxécutent beaucoup plus rapidement!!!
    un deadlock ne peut se produire qu'en multithreading, donc tu es déjà en multithreading
    Qu'y-a-t-il donc lieu de faire?

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    quand on fait un traitement long, on le fait sur un thread séparé
    souvent fois il peut etre optimisé pour gagner du temps sinon (mais il nous faudrait une partie du code pour te donner des pistes)

    et sinon il faudrait trouver ce qui fait du multithreading sans que tu le saches ... tu as utilisé un timer qui n'est pas le windows.forms.timer ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 143
    Par défaut
    OK, voici un bout de mon code, avec les différents "Application.doevents" que j'y ai ajouté.

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    'Create Vector
            For i = 0 To largeur - 1
                For j = 0 To hauteur - 1
                    pixel = bmp.GetPixel(i, j).R
                    If pixel = 255 Then
                        tabloImage(i, j) = 0
                    Else
                        tabloImage(i, j) = 1
                        AddSquareVector(i, j)
                        Application.DoEvents()
                    End If
                Next
            Next
     
            'Simplify vector
            For m = 0 To Vnum - 2
                For m2 = m + 1 To Vnum - 1
                    If EqualVectors(m, m2) Then
                        RemoveVectors(m, m2)
                        Application.DoEvents()
                    End If
                Next
            Next
     
    'Avec les définitions les fonctions ci-dessus définies comme suit
     
    Public Sub AddSquareVector(ByVal i As Integer, ByVal j As Integer)
     
            ReDim Preserve V(Vnum + 3)
     
            V(Vnum).prec = Vnum + 3
            V(Vnum).Sx = i : V(Vnum).Sy = j
            V(Vnum).Ex = i + 1 : V(Vnum).Ey = j
            V(Vnum).suiv = Vnum + 1
            V(Vnum).status = 0
     
            Vnum += 1
     
            V(Vnum).prec = Vnum - 1
            V(Vnum).Sx = i + 1 : V(Vnum).Sy = j
            V(Vnum).Ex = i + 1 : V(Vnum).Ey = j + 1
            V(Vnum).suiv = Vnum + 1
            V(Vnum).status = 0
     
            Vnum += 1
     
            V(Vnum).prec = Vnum - 1
            V(Vnum).Sx = i + 1 : V(Vnum).Sy = j + 1
            V(Vnum).Ex = i : V(Vnum).Ey = j + 1
            V(Vnum).suiv = Vnum + 1
            V(Vnum).status = 0
     
            Vnum += 1
     
            V(Vnum).prec = Vnum - 1
            V(Vnum).Sx = i : V(Vnum).Sy = j + 1
            V(Vnum).Ex = i : V(Vnum).Ey = j
            V(Vnum).suiv = Vnum - 3
            V(Vnum).status = 0
     
            Vnum += 1
     
     
        End Sub
     
    Public Function EqualVectors(ByVal m As Integer, ByVal m2 As Integer) As Boolean
            Dim msx, msy, mex, mey, m2sx, m2sy, m2ex, m2ey As Integer
            Dim r As Boolean
     
            r = False
            If (V(m).status = 0) Then
                msx = V(m).Sx : msy = V(m).Sy : mex = V(m).Ex : mey = V(m).Ey
                m2sx = V(m2).Sx : m2sy = V(m2).Sy : m2ex = V(m2).Ex : m2ey = V(m2).Ey
     
                If EqualPoints(msx, msy, m2sx, m2sy) And EqualPoints(mex, mey, m2ex, m2ey) Then
                    r = True
                End If
     
                If EqualPoints(msx, msy, m2ex, m2ey) And EqualPoints(mex, mey, m2sx, m2sy) Then
                    r = True
                End If
            End If
            Application.DoEvents()
            Return r
     
        End Function
     
    Public Function EqualPoints(ByVal pt1x As Integer, ByVal pt1y As Integer, ByVal pt2x As Integer, ByVal pt2y As Integer) As Boolean
            Dim r As Boolean
     
            r = False
            If (pt1x = pt2x) And (pt1y = pt2y) Then
                r = True
            End If
     
     
            Return r
        End Function
     
     
    Public Sub RemoveVectors(ByVal m As Integer, ByVal m2 As Integer)
            removeVector(m, m2)
            removeVector(m2, m)
     
            V(m).status = -1
            V(m2).status = -1
        End Sub
     
    Public Sub removeVector(ByVal mm As Integer, ByVal mm2 As Integer)
            Dim p, n As Integer
     
            p = V(mm).prec : V(p).suiv = V(mm2).suiv
            n = V(mm2).suiv : V(n).prec = p
        End Sub
    Je sais que c'est pas très très digeste comme code, mais bon...
    J'ai essayé de mettre des "application.doevents" après l'appel de chacune des ces nombreuses fonctions.
    J'ai un deuxième programme qui pose le même problème, mais si je le poste ici, je crois que vous ne voudrez plus lire mon code (Vu la densité de l'imbrication des if et case, for et consore)

Discussions similaires

  1. Erreur de Switch.. Comment appeler 2 variables?
    Par batnoir dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 23/09/2009, 21h56
  2. erreur contexte tomcat 5.5.17 sous eclipse 3.4
    Par al3alwa dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 01/04/2009, 08h47
  3. Implémenter un Context Switching
    Par Thor Tillas dans le forum C++
    Réponses: 5
    Dernier message: 14/11/2006, 20h53
  4. [C#]erreur de switch - datatable
    Par igorzup dans le forum ASP.NET
    Réponses: 2
    Dernier message: 08/08/2006, 12h29
  5. erreur contexte tomcat sous eclipse
    Par decksroy dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 15/06/2006, 17h17

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