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

cs_BinKentsu 66 Messages postés jeudi 1 septembre 2011Date d'inscription 22 juillet 2014 Dernière intervention - 12 juil. 2014 à 10:50 - Dernière réponse : cs_BinKentsu 66 Messages postés jeudi 1 septembre 2011Date d'inscription 22 juillet 2014 Dernière intervention
- 22 juil. 2014 à 10:42
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/
Afficher la suite 

Votre réponse

2 réponses

NHenry 14260 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 16 septembre 2018 Dernière intervention - 19 juil. 2014 à 14:19
0
Merci
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.
Commenter la réponse de NHenry
cs_BinKentsu 66 Messages postés jeudi 1 septembre 2011Date d'inscription 22 juillet 2014 Dernière intervention - 22 juil. 2014 à 10:42
0
Merci
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();
}

Commenter la réponse de cs_BinKentsu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.