Variables communes à plusieurs threads (multithreading) [Résolu]

Signaler
Messages postés
65
Date d'inscription
jeudi 1 septembre 2011
Statut
Membre
Dernière intervention
22 juillet 2014
-
Messages postés
65
Date d'inscription
jeudi 1 septembre 2011
Statut
Membre
Dernière intervention
22 juillet 2014
-
Bonjour tout le monde!

Cela fait plus d'une semaine que je me casse la tête à propos d'utiliser des variables communes entre plusieurs threads.
Mon logiciel qui se situe en production, possède deux threads, un thread principal pour l'interface graphique, et un autre thread qui celui-ci contient un cycle infini. Ce cycle doit permettre de gérer le cycle automatique d'une machine contenant deux équipements Ethernet, un module d'entrées sorties Adam 6052, et un détecteur 3D IFM O3D200.
De temps en temps j'ai un problème au niveau du cycle automatique, j'ai des ralentissements anormaux que je n'ai pas si au lieu d'utiliser un thread j'utilise un timer.
Et j'ai un deuxième problème, quand je souhaite fermer mon logiciel, je lance un événement de fermeture qui est censé quitter la boucle infini du thread. La plupart du temps cet événement ne passe pas, et je pense que le problème est lié à l'accès aux variables communes aux deux threads.
Auriez-vous une idée s'il vous plait?

Merci!

A cette adresse j'ai les fichiers du cycle automatique, des événements communs aux threads, et des variables communes aux threads.
http://www.developpez.net/forums/d1456967/dotnet/langages/csharp/variables-communes-plusieurs-thread-multithreading/

2 réponses

Messages postés
14672
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 mai 2020
143
Il est possible que ton problème vienne d'optimisation basiques mais non adaptées au threading, essayes de passer tes variables communes (dans la mesure du possible) en volatile.
Messages postés
65
Date d'inscription
jeudi 1 septembre 2011
Statut
Membre
Dernière intervention
22 juillet 2014
7
Le problème est résolu, il s'agissait d'un inter-blocage des threads (explication à cette adresse http://www.developpez.net/forums/d1456967/dotnet/langages/csharp/variables-communes-plusieurs-thread-multithreading/).
J'ai mis le bout de code qui me bloquait en asynchrone, pour éviter l'inter-blocage des threads, à présent l'arrêt du programme se fait normalement.
J'ai mis l'exemple ci-dessous, merci pour votre aide !

CCommonVariables.MultiThreadingVariables.AutoManuCycle.StopCycle = true;
CCommonVariables.MultiThreadingVariables.AutoManuCycle.OnProcessStepChanged -= AutoManuCycle_OnProcessStepChanged;
await Task.Run(() =>
{
    // Execution du test d'état du cycle en asynchrone car bloquante dans le thread principal (temps d'attente avant que la demande
    // d'arrêt a bien été prise en compte
    while (CCommonVariables.MultiThreadingVariables.AutoManuCycle.CycleStatus != ECycleStatus.Stopped)
        Thread.Sleep(10);
});                    

// Demande aux threads de finir leur cycle en cours
if ((_threadAutoManuCycle != null) && _threadAutoManuCycle.IsAlive)
{
    CCommonVariables.MultiThreadingVariables.AutoManuCycle.ExitThread();
    _threadAutoManuCycle.Join();
}