Variables communes à plusieurs threads (multithreading)

Résolu
cs_BinKentsu Messages postés 64 Date d'inscription jeudi 1 septembre 2011 Statut Membre Dernière intervention 22 juillet 2014 - 12 juil. 2014 à 10:50
cs_BinKentsu Messages postés 64 Date d'inscription jeudi 1 septembre 2011 Statut Membre Dernière intervention 22 juillet 2014 - 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/
A voir également:

2 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
19 juil. 2014 à 14:19
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.
0
cs_BinKentsu Messages postés 64 Date d'inscription jeudi 1 septembre 2011 Statut Membre Dernière intervention 22 juillet 2014 8
22 juil. 2014 à 10:42
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();
}

0
Rejoignez-nous