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 :

Probleme multi threading


Sujet :

VB.NET

  1. #1
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Bonjour à tous,

    Toujours sur mon projet de supervision de cycle de mesure de pièce pour ceux qui ont vu mon précédent post..

    Il y a quelque chose que je ne comprend toujours pas. Je lance des threads pour analyser mes pieces de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim t As New Thread(Sub() AnalysePiece(piece))
    t.IsBackGround = True
    t.Start()
    Cependant j'ai l'impression que la méthode AnalysePiece ralentit quand même le thread principal. Pourtant je pensais que cela s’exécutait en dehors de celui ci..
    Si j'omets ces quelques lignes mon programme lit les entrées, ajoute les pièces détectées et écrit les sorties comme il faut donc je pense que quelque chose m'échappe dans la notion de multithreading..

    Je voudrais juste lancer un timer qui va analyser ma pièce toute les x millisecondes mais sur un autre thread que le principal, pour ne pas le gêner dans son taf perso..

    Cela fait des jours que je me bats avec ça et là j'en peux plus

    Si quelqu'un a des lumières a m'apporter..

    Merci d'avance

    PS: avant j'utilisais un Threading.Timer comme on me la conseillé mais j'avais le même problème..
    J’ai des questions à toutes vos réponses!

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Bonjour,

    combien de threads lances-tu de manière simultanée ?
    Puisque si tu en lances trop au bout d'un moment forcément le processeur alternera entre thread principal, et threads secondaires
    Le Porc est un loup pour le Porc.

  3. #3
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Au bout de 2 pièces à analyser je remarque que cela ne marche déjà plus comme il faut.. En fait j'ai réessayé cette méthode par désespoir de cause car malgrès tout mes essais, je ne voyais pas le résultat attendu..

    Jusqu'à hier j'avais un threading.timer par pièce (et donc un seul thread par piece?) qui exécutait cette méthode jusqu'à son éjection. Mais j'avais le même problème..

    Je ne sais plus quoi essayer..
    J’ai des questions à toutes vos réponses!

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Le timer lance un nouveau Thread aussi.

    Sinon la logique des Threads c'est de dire à mon processeur:
    J'ai une tache A et une tache B fait les tournée en même temps
    donc le processeur va faire un peu de A puis un peu de B puis retourner sur A

    donc des que tu fais tu threadings tu ralenti un peu A
    mais vu que A s'active tout les X temps tu as l'impression qu'il n'est jamais bloquée


    Que fait AnalysePiece? Acces à des resources? bd,fichier,reseau,port?
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  5. #5
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Salut BenoitM,
    Citation Envoyé par BenoitM Voir le message
    Que fait AnalysePiece? Acces à des resources? bd,fichier,reseau,port?
    Rien de tout ça. En fait ça calcule l'emplacement de la pièce sur le plateau tournant et lance les mesures nécessaires en fonction de cette position (pour l'instant aucune..).

    PS: Je suis revenu au Threading.Timer par piece (nait à la detection, meurt à l'ejection), la solution la moins abérante que j'ai pu essayer..
    J’ai des questions à toutes vos réponses!

  6. #6
    Membre actif Avatar de AcidLines
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Février 2010
    Messages : 198
    Points : 279
    Points
    279
    Par défaut
    Bonjour,

    Si jamais tu utilises le Framework 4, tu as une librairie intéressante sur le multi task. Au besoin voici le cours de Webman :

    http://webman.developpez.com/article...tionparallele/

    Est ce que par hasard, tes différents Threads n'accèderait pas tout deux à des variables globales ? Peut être en conflit sur les accès mémoire (ça m'étonnerait mais bon..) ?

  7. #7
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Salut,
    Citation Envoyé par AcidLines Voir le message
    Est ce que par hasard, tes différents Threads n'accèderait pas tout deux à des variables globales ?
    Euh oui j'ai des objets "Poste" (qui représentent les différents postes..) qui sont utilisés à chaque analyse de pièce. Par exemple pour savoir si la pièce est arrivée au niveau du poste, si le poste est occupé, lancer l'analyse, etc.
    Ce sont les mêmes objets pour toutes les pièces (passés en paramètres lors de la création de la pièce). Ça peut jouer??
    J’ai des questions à toutes vos réponses!

  8. #8
    Membre actif Avatar de AcidLines
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Février 2010
    Messages : 198
    Points : 279
    Points
    279
    Par défaut
    Vu qu'un objet est stocké tout comme une variable en mémoire, l'accès simultanée à cette adresse mémoire peut peut être occasionné un conflit.

    Je ne sais pas si c'est le cas, mais de Thread qui essaye de modifier un objet (ou meme tout simplement l'accès en read peut être) cela ne fait pas parti des opération Inter thread ? qui ne sont peut être pas réalisable directement ?

    il faudrait peut être dans ces cas là faire un genre de Token entre les thread, mais du coup ils ne seront plus simultanés mais dependants. Je sais pas si je suis clair ni si je suis dans la bonne optique.

    (N'utilisant pas souvent les traitements parallèles a part parfois avec un seul BackgroundWorker )

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    on peut lancer beaucoup de threads sans voir d'impact sur le thred d'UI, windows laisse le même laps de temps à chaque thread, et le thread d'UI ne réclame pas grand chose, donc ca serait étrange qu'il rame à cause de ca

    partager des objets entre les threads ne ralentit pas non plus, plusieurs threads peuvent lire la même chose en même temps, et quand il n'y a pas des problèmes de multithread, ca fait une exception en général
    c'est à ce moment là qu'on met en place des mécanisme de thread safe (lock, readerwriterlock etc...) qui eut peuvent ralentir tout ce qui accède aux objets verrouillées temporairement

    il nous faudrait le code pour t'aider ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Pour être plus précis:

    J'ai ma classe CycleManager qui contient cette méthode (exécutée toutes les ms):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Private Sub Execute()
            Try
                If Running Then
                    IOManager.ReadInputs()
                    CurrentGamme.AddPiece()
                    IOManager.WriteOutputs()
                End If
            Catch ex As Exception
     
            End Try
        End Sub
    Ma gamme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Sub AddPiece()
            Try
                E6Value = Inputs("E6")
                If E6FrontMontant Then
     
                    Dim p As New Piece
                    p.StartAnalyse()
     
                End If
     
            Catch ex As Exception
     
            End Try
        End Sub
    Et ma piece:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Sub StartAnalyse()
            Me.Timer = New Threading.Timer(Sub() AnalyzePiece(), Nothing, 0, 1)
        End Sub
     
        Sub StopAnalyse()
            Me.Timer.Dispose()
        End Sub
    J’ai des questions à toutes vos réponses!

  11. #11
    Membre actif Avatar de AcidLines
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Février 2010
    Messages : 198
    Points : 279
    Points
    279
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    plusieurs threads peuvent lire la même chose en même temps
    Dans le cas dans un accès en écriture ? (Je ne sais pas si c'est le cas de Nawak)

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    l'accès simultanné en read ne pose pas de soucis
    l'accès simultanné en write ne pose pas non plus de délai ou d'erreur
    le truc qui peut arriver c'est que si tu as une variable qui vaut 1 et que 2 threads font +1, au lieu d'avoir 3 tu peux avoir 2, car si chacun lit la valeur (1) fait +1 puis stocke la valeur ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    L'analyse de ma pièce ne modifie pas mes autres objets, elles lit juste les valeurs nécessaires et lance l'analyse d'un poste si besoin est.
    J’ai des questions à toutes vos réponses!

  14. #14
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Si je commente la ligne 7 de ma méthode AddPiece dans ma gamme (p.StartAnalyse()), le programme se déroule comme il faut, sinon le thread à l'air complètement perturbé par cette analyse..

    Qu'est ce que j'ai loupé??
    J’ai des questions à toutes vos réponses!

  15. #15
    Membre actif Avatar de AcidLines
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Février 2010
    Messages : 198
    Points : 279
    Points
    279
    Par défaut
    Tu as quoi dans qui est appeler dans ta sub ?
    Je n'ai pas vu le code de ta fonction/proc (ou alors faut je fasse une pause et que j'aille changer de lunettes.)

  16. #16
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    C'est moi qui devrais aller faire une pause

    Voici la méthode:
    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
        Private Sub AnalyzePiece()
            Try
                If Not Me.Analyzing Then
                    Me.Analyzing = True
     
                    'Si l'analyse est terminée pour la piece..
                    If Me.Analyse_Completed AndAlso Not Me.Cycle_Completed Then
                        'On recupère la 1ere caméra qui a renvoyé une analyse négative
                        Dim camOutput As Camera = (From r In Me.Results Where Not r.Value Select r.Key).FirstOrDefault
     
                        'Si on a un nom..
                        Dim time As Integer = TimeEjectionOK
                        Dim outputname As String = "S11"
     
                        If camOutput IsNot Nothing Then
                            time = camOutput.TimeEjection
                            outputname = camOutput.OutputEjection
                        ElseIf Me.Analyse_Aborted Then
                            time = TimeEjectionOK
                            outputname = ""
                        End If
     
                        'Si c'est l'heure, on ejecte..
                        If Me.Time_Fibre + time <= GetTickCount Then
                            Me.Cycle_Completed = True
                            Ejection(Me, outputname)
                        End If
                    Else
                        'on récupère la caméra active que l'on vient de dépassée et qui n'a pas encore analysé
                        Dim camAnalyse As Camera = (
                            From c In Cameras
                            Where c.Activated _
                            AndAlso Not Me.Results.ContainsKey(c) _
                            AndAlso GetTickCount() >= Me.Time_Fibre + c.TimeTrigger _
                            Select c).FirstOrDefault
     
                        'Si on a une camera, on lance l'analyse..
                        If camAnalyse IsNot Nothing Then
                            'On ajoute le resultat aux resultats de la piece
                            If Not camAnalyse.Busy Then
                                Me.Results.Add(camAnalyse, False)
                                Me.Results(camAnalyse) = camAnalyse.Analyse
     
                                'log suivant le resultat
                                If Me.Results(camAnalyse) Then
                                    SendMessage("Piece n°" + Me.Numero_Piece.ToString + " a passé " + camAnalyse.Name + " [OK].")
                                Else
                                    SendMessage("Piece n°" + Me.Numero_Piece.ToString + " a passé " + camAnalyse.Name + " [NOK].")
                                End If
     
                                'Si analyse complete..
                                If camAnalyse Is (From c In Cameras Where c.Activated Select c).LastOrDefault Then
                                    Me.Analyse_Completed = True
                                End If
                            ElseIf Not Me.Results.ContainsKey(camAnalyse) Then
                                SendMessage(camAnalyse.Name + " occupée. Mesures interrompues pour piece n°" + Me.Numero_Piece.ToString + ".")
                                Me.Analyse_Aborted = True
                                Me.Analyse_Completed = True
                            End If
                        End If
                    End If
     
                    Me.Analyzing = False
     
                End If
            Catch ex As Exception
                'Erreur analyse piece courante
                SendError("Analyse échouée pour piece n°" + Me.Numero_Piece.ToString + ".")
                SendError("Message d'erreur: " + ex.Message)
            End Try
        End Sub
    Merci pour ton aide AcidLines

    EDIT:

    C'est bien le contenu de cette méthode qui ralentit le thread principal (même si elle s’exécute sur un autre thread) car en la laissant s'exécuter avec un contenu vide, le programme marche bien.

    Je suppose qu'il faut que je cherche tout ce qui rattache ce thread au thread principal afin de lui rendre un maximum d'indépendance.
    J’ai des questions à toutes vos réponses!

  17. #17
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Le fait est que dans mon analyse chacune des pièces connait les cameras qui sont uniques, dont les pièces se "partagent" les cameras. Est ce que cela peut poser soucis du fait que ces cameras sont contenues dans ma gamme? Devrais je revoir la conception de mes classes?
    J’ai des questions à toutes vos réponses!

  18. #18
    Membre actif Avatar de AcidLines
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Février 2010
    Messages : 198
    Points : 279
    Points
    279
    Par défaut
    Bonjour,

    Et désolé de répondre tardivement (Week end oblige).
    Je ne vois rien qui pourrait clocher dans ton code.

    Cependant, tu pourrais peut être faire analyser ton code via les outils
    de VS. Il peut te dire quels sont les fonctions plus ou moins gourmande.

    Car là honnêtement, je sèche =/
    Après je vois que tu as encore des méthodes dans cette fonction, peut être
    faut il envisager de vérifier toutes les méthodes appelées.

  19. #19
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Bonjour.

    Plusieurs choses :
    • Si l'on prévoit d'avoir de nombreux threads de calcul et que l'on souhaite garder l'UI réactive, les threads de calcul doivent avoir une priorité plus basse.
    • Si l'UI effectue elle aussi des opérations gourmandes en CPU, il est normal que sur un dualcore on observe un ralentissement à partir deux threads de calcul : il faut bien partager les deux CPU sur les trois threads, d'où les priorités, pas la peine de chercher plus loin. Si l'UI ne fait rien de spécial en revanche, deux threads de calcul ne devraient pas poser de problème et donc le problème est ailleurs et ne sera pas forcément résolu avec ces seules priorités.
    • Y a t-il compétition au niveau des ressources physiques ? Ram limitée obligeant à swapper notamment ? Les données de l'UI se retrouveraient alors délestée sur le disque, d'où les ralentissements. Si tel est le cas c'est difficile : on peut stimuler l'UI en permanence (timer rafraîchissant l'UI toutes les 15ms par ex) ou réduire les threads de calcul selon la mémoire.
    • Y a t-il compétition sur la contention de certaines données ? Si par exemple certaines sont protégées par des verrous ? L'UI se retrouverait alors à attendre qu'un thread relâche un verrou pour réagir aux actions de l'utilisateur. Si tel est le cas il faut revoir la stratégie de synchronisation utilisée, par exemple en dupliquant les données (un jeu par thread).
    • Les ralentissements sont-ils bien observés en réaction aux entrées de l'utilisateur ? Ou bien plutôt en réaction à des événements déclenchés par les threads de calcul ? Si tel est le cas le problème se situe peut-être au niveau de la communication inter-threads.


    Je peux détailler au besoin si un de ces points t'interpelle.

  20. #20
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Salut et merci pour vos réponses,

    Je n'étais pas sur le projet hier et j'ai vu seulement aujourd'hui vos messages..

    Bon bah du coup j'ai trouvé la source du problème.. Il se trouve effectivement dans une méthode qui était appelée dans AnalysePiece(), à la ligne 42 du code de mon précédent message (appel de la méthode camera.Analyse()).
    Dans cette méthode, j'avais volontairement mis une tempo de 700ms pour simuler un traitement au poste en question. Cela perturbait mon thread principal pour une raison que je n'ai toujours pas comprise car c'est un autre thread que le thread principal qui appelle cette méthode (je répète: un thread par pièce qui calcule sa position et lance des traitements en conséquence).. donc je ne vois pas pourquoi cela à un impact sur le reste de mon programme..

    Voila ma méthode Camera.Analyse():
    => version d'origine, qui ne marchait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Function Analyse() As Boolean Implements Camera.Analyse
            Busy = True
     
            Dim endTime As Long = GetTickCount + 700
            While endTime > GetTickCount
     
            End While
     
            Busy = False
            Return True
        End Function
    =>version modifiée (un peu mieux je pense au niveau de la conception), qui ne marche toujours pas SI on simule de la même manière une tempo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Overrides Sub Analyse(Piece As Piece)
            Me.Busy = True
     
            'traitements qui peuvent durer plusieurs centaines de ms
            '..
     
            Piece.Results(Me) = True
            Me.Busy = False
        End Sub
    Actuellement si je ne prend pas en compte la durée d'un traitement, ça fonctionne..

    J'ai essayé de créer un nouveau thread spécialement pour le traitement (New Thread) mais cela perturbe quand même..

    Si vous avez une idée
    J’ai des questions à toutes vos réponses!

Discussions similaires

  1. probleme OpenMP multi-threading
    Par toetoe dans le forum Programmation système
    Réponses: 1
    Dernier message: 29/12/2012, 14h39
  2. Multi Thread - probleme release
    Par CSharpN dans le forum C#
    Réponses: 2
    Dernier message: 21/12/2012, 12h20
  3. probleme avec [#document: null] et multi-thread
    Par zouuc dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 05/02/2009, 09h43
  4. Probleme serveur multi-thread - Eclipse
    Par SpIrIt505050 dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 31/05/2008, 12h50
  5. [Multi-threading] Probleme avec les mutex
    Par homeostasie dans le forum Visual C++
    Réponses: 2
    Dernier message: 07/03/2007, 10h00

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