cs_BinKentsu
Messages postés64Date d'inscriptionjeudi 1 septembre 2011StatutMembreDernière intervention22 juillet 2014
-
12 juil. 2014 à 10:50
cs_BinKentsu
Messages postés64Date d'inscriptionjeudi 1 septembre 2011StatutMembreDernière intervention22 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?
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023159 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.
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();
}