diff --git a/DMX-2.0/Conduite.cs b/DMX-2.0/Conduite.cs index f6d593d..0338648 100644 --- a/DMX-2.0/Conduite.cs +++ b/DMX-2.0/Conduite.cs @@ -16,7 +16,7 @@ namespace DMX2 public static Conduite Courante { get { return courante; } } - Timer timer = null; // Timer de Mise a jour en arriere plan + Thread tickThread = null; // Thread de Mise a jour en arriere plan DateTime dernierTick; // Derniere execution du timer DateTime derniereMaj; // Derniere MAJ de l'affichage string _name; // Nom de la conduite @@ -30,14 +30,19 @@ namespace DMX2 SequenceurMaitre seqmaitre = new SequenceurMaitre(); EventManager eventManager = new EventManager(); // Gestion des fournisseurs d'evenements - MidiEventProvider midip=null; actionEventTarget masterEventTarget; // Recepteur d'evenements pour le master - public Conduite() + bool running=true; + + public Conduite (): this(true) + { + } + + Conduite (bool startthread) { // Conduite courante => la derniere instanciee - if(courante!= null) - courante.Dispose(); + if (courante != null) + courante.Dispose (); courante = this; // Les ID reprennent à 1 @@ -46,22 +51,30 @@ namespace DMX2 UniversDMX.maxid = 1; // Crée l'univers par défaut - var u = new UniversDMX(); - Patches.Add(u); + var u = new UniversDMX (); + Patches.Add (u); u.Nom = "Univers par Défaut"; // La conduite peux recevoir des evenements midi - midip = new MidiEventProvider(eventManager); + MidiEventProvider midip = new MidiEventProvider (eventManager); - masterEventTarget = new actionEventTarget( - delegate(EventData data){ - Master = 100 * data.value /255; + masterEventTarget = new actionEventTarget ( + delegate(EventData data) { + Master = 100 * data.value / 255; return true; - }); + } + ); - // Démarrage du timer - timer = new Timer(new TimerCallback(TimerTick),this, 1000,10); - derniereMaj = dernierTick=DateTime.Now; + if (startthread) StartThread(); + } + + void StartThread() + { + if(tickThread != null) return; + // Démarrage du thread + tickThread = new Thread (new ThreadStart (ThreadLoop)); + tickThread.Start (); + derniereMaj = dernierTick = DateTime.Now; } public EventManager EventManager { @@ -164,10 +177,20 @@ namespace DMX2 } } - static public void TimerTick (object state) + // On utilise un thread qui boucle au lieu d'un timer. + // C'est moins précis, mais ca consomme beaucoup moins de ressources + void ThreadLoop () { Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; - (state as Conduite).Tick(); + TimeSpan delay = TimeSpan.FromMilliseconds(10); + TimeSpan sleeptime; int i=0; + + while (running) { + Tick(); + sleeptime = delay.Subtract(DateTime.Now - dernierTick); + if(sleeptime > TimeSpan.Zero) + Thread.Sleep(sleeptime); + } } void Tick () @@ -178,8 +201,8 @@ namespace DMX2 if (!Pause) { - /* if (deltaT > TimeSpan.FromMilliseconds (15)) - Info.Publish(string.Format ("{0}", deltaT));*/ + if (deltaT > TimeSpan.FromMilliseconds (12)) + Info.Publish(string.Format ("{0}", deltaT)); lock (this) { @@ -196,16 +219,22 @@ namespace DMX2 foreach (var c in circuits) c.ValeurCourante = 0; } - else - { - foreach (var c in circuits) { - int val = 0; - foreach (var seq in Sequenceurs) { - val = Math.Max (val, seq.ValeurCircuit (c)); + else if(master != 100){ + foreach (var c in circuits) { + int val = 0; + foreach (var seq in Sequenceurs) { + val = Math.Max (val, seq.ValeurCircuit (c)); + } + c.ValeurCourante = val * master / 100; + } + } else { + foreach (var c in circuits) { + int val = 0; + foreach (var seq in Sequenceurs) { + val = Math.Max (val, seq.ValeurCircuit (c)); + } + c.ValeurCourante = val; } - c.ValeurCourante = val * master / 100; - } - } EventManager.ProcessEvents(); @@ -234,16 +263,20 @@ namespace DMX2 #region IDisposable implementation bool disposed=false; - public void Dispose() + public void Dispose () { - if(disposed) return; - if(courante==this) + if (disposed) + return; + if (courante == this) courante = null; - if(timer!=null) - timer.Dispose(); + if (tickThread != null) { + running = false; + tickThread.Join(50); + tickThread.Abort(); + } foreach(var driver in Drivers) driver.Dispose(); - timer=null; + tickThread=null; disposed=true; } @@ -293,16 +326,10 @@ namespace DMX2 return xmlDoc; } - public static Conduite Load (XmlDocument doc) + public Conduite(XmlDocument doc) : this(false) { //TODO : Gestion d'erreurs - Conduite cond = new Conduite (); - cond.LoadDoc (doc); - return cond; - } - private void LoadDoc (XmlDocument doc) - { XmlElement root = doc.DocumentElement; _name = root.Attributes ["nom"].Value; @@ -340,6 +367,7 @@ namespace DMX2 seqmaitre = SequenceurMaitre.Load(this,root["SequenceurMaitre"]); + StartThread(); } #endregion diff --git a/DMX-2.0/DMX-2.0.csproj b/DMX-2.0/DMX-2.0.csproj index e7afef6..462ff34 100644 --- a/DMX-2.0/DMX-2.0.csproj +++ b/DMX-2.0/DMX-2.0.csproj @@ -18,8 +18,8 @@ DEBUG; prompt 4 - true fullscreen aguibtn + false none diff --git a/DMX-2.0/DriverBoitierV1.cs b/DMX-2.0/DriverBoitierV1.cs index a4ae85c..3be81de 100644 --- a/DMX-2.0/DriverBoitierV1.cs +++ b/DMX-2.0/DriverBoitierV1.cs @@ -217,7 +217,8 @@ namespace DMX2 void IEventProvider.ProcessEvents (EventManagerCallback callback) { - buttonState bt; string id; EventData evd; + buttonState bt; + EventData evd; while (eventsPending.TryDequeue(out bt)) { evd.id= string.Format("BV1-B{0}",bt.button ); evd.value = bt.pressed?(byte)0xFF:(byte)0x00; diff --git a/DMX-2.0/MainWindow.cs b/DMX-2.0/MainWindow.cs index 98d0511..3061541 100644 --- a/DMX-2.0/MainWindow.cs +++ b/DMX-2.0/MainWindow.cs @@ -391,7 +391,7 @@ namespace DMX2 stream.Close(); } - Conduite cond = Conduite.Load(doc); + Conduite cond = new Conduite(doc); if (cond==null) { // TODO Message erreur au chargement diff --git a/DMX-2.0/SequenceurLineaire.cs b/DMX-2.0/SequenceurLineaire.cs index a3b0a16..2c9fcb2 100644 --- a/DMX-2.0/SequenceurLineaire.cs +++ b/DMX-2.0/SequenceurLineaire.cs @@ -270,7 +270,7 @@ namespace DMX2 public override int ValeurCircuit (Circuit c) { lock(this) { - if (!circuitsSeq.Contains (c)) + if (!valeurscourantes.ContainsKey (c)) return 0; if (master != 100) return valeurscourantes [c] * master / 100; diff --git a/DMX-2.0/SequenceurMacro.cs b/DMX-2.0/SequenceurMacro.cs index c436fb0..7b2774f 100644 --- a/DMX-2.0/SequenceurMacro.cs +++ b/DMX-2.0/SequenceurMacro.cs @@ -291,7 +291,7 @@ namespace DMX2 public override int ValeurCircuit (Circuit c) { - if (!circuitsSeq.Contains (c)) + if (!valeurscourantes.ContainsKey (c)) return 0; if(master !=100) return valeurscourantes [c] * master /100; @@ -313,14 +313,17 @@ namespace DMX2 lock (this) { - List circuits = new List (effetsEnCours.Keys); + if(effetsEnCours.Count>0) + { + List circuits = new List (effetsEnCours.Keys); - foreach (Circuit c in circuits) { - if (effetsEnCours [c].Incremente (time)) { - valeurscourantes [c] = effetsEnCours [c].ValeurFinale; - effetsEnCours.Remove (c); - } else { - valeurscourantes [c] = effetsEnCours [c].ValeurCourante (); + foreach (Circuit c in circuits) { + if (effetsEnCours [c].Incremente (time)) { + valeurscourantes [c] = effetsEnCours [c].ValeurFinale; + effetsEnCours.Remove (c); + } else { + valeurscourantes [c] = effetsEnCours [c].ValeurCourante (); + } } } }