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 ();
+ }
}
}
}