Amélioration des perfs

This commit is contained in:
tzim 2013-11-20 14:26:35 +00:00
parent 5e8a8f6095
commit aa3d405b6c
6 changed files with 85 additions and 53 deletions

View file

@ -16,7 +16,7 @@ namespace DMX2
public static Conduite Courante { get { return courante; } } 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 dernierTick; // Derniere execution du timer
DateTime derniereMaj; // Derniere MAJ de l'affichage DateTime derniereMaj; // Derniere MAJ de l'affichage
string _name; // Nom de la conduite string _name; // Nom de la conduite
@ -30,14 +30,19 @@ namespace DMX2
SequenceurMaitre seqmaitre = new SequenceurMaitre(); SequenceurMaitre seqmaitre = new SequenceurMaitre();
EventManager eventManager = new EventManager(); // Gestion des fournisseurs d'evenements EventManager eventManager = new EventManager(); // Gestion des fournisseurs d'evenements
MidiEventProvider midip=null;
actionEventTarget masterEventTarget; // Recepteur d'evenements pour le master 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 // Conduite courante => la derniere instanciee
if(courante!= null) if (courante != null)
courante.Dispose(); courante.Dispose ();
courante = this; courante = this;
// Les ID reprennent à 1 // Les ID reprennent à 1
@ -46,22 +51,30 @@ namespace DMX2
UniversDMX.maxid = 1; UniversDMX.maxid = 1;
// Crée l'univers par défaut // Crée l'univers par défaut
var u = new UniversDMX(); var u = new UniversDMX ();
Patches.Add(u); Patches.Add (u);
u.Nom = "Univers par Défaut"; u.Nom = "Univers par Défaut";
// La conduite peux recevoir des evenements midi // La conduite peux recevoir des evenements midi
midip = new MidiEventProvider(eventManager); MidiEventProvider midip = new MidiEventProvider (eventManager);
masterEventTarget = new actionEventTarget( masterEventTarget = new actionEventTarget (
delegate(EventData data){ delegate(EventData data) {
Master = 100 * data.value /255; Master = 100 * data.value / 255;
return true; return true;
}); }
);
// Démarrage du timer if (startthread) StartThread();
timer = new Timer(new TimerCallback(TimerTick),this, 1000,10); }
derniereMaj = dernierTick=DateTime.Now;
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 { 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; 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 () void Tick ()
@ -178,8 +201,8 @@ namespace DMX2
if (!Pause) { if (!Pause) {
/* if (deltaT > TimeSpan.FromMilliseconds (15)) if (deltaT > TimeSpan.FromMilliseconds (12))
Info.Publish(string.Format ("{0}", deltaT));*/ Info.Publish(string.Format ("{0}", deltaT));
lock (this) { lock (this) {
@ -196,16 +219,22 @@ namespace DMX2
foreach (var c in circuits) foreach (var c in circuits)
c.ValeurCourante = 0; c.ValeurCourante = 0;
} }
else else if(master != 100){
{ foreach (var c in circuits) {
foreach (var c in circuits) { int val = 0;
int val = 0; foreach (var seq in Sequenceurs) {
foreach (var seq in Sequenceurs) { val = Math.Max (val, seq.ValeurCircuit (c));
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(); EventManager.ProcessEvents();
@ -234,16 +263,20 @@ namespace DMX2
#region IDisposable implementation #region IDisposable implementation
bool disposed=false; bool disposed=false;
public void Dispose() public void Dispose ()
{ {
if(disposed) return; if (disposed)
if(courante==this) return;
if (courante == this)
courante = null; courante = null;
if(timer!=null) if (tickThread != null) {
timer.Dispose(); running = false;
tickThread.Join(50);
tickThread.Abort();
}
foreach(var driver in Drivers) foreach(var driver in Drivers)
driver.Dispose(); driver.Dispose();
timer=null; tickThread=null;
disposed=true; disposed=true;
} }
@ -293,16 +326,10 @@ namespace DMX2
return xmlDoc; return xmlDoc;
} }
public static Conduite Load (XmlDocument doc) public Conduite(XmlDocument doc) : this(false)
{ {
//TODO : Gestion d'erreurs //TODO : Gestion d'erreurs
Conduite cond = new Conduite ();
cond.LoadDoc (doc);
return cond;
}
private void LoadDoc (XmlDocument doc)
{
XmlElement root = doc.DocumentElement; XmlElement root = doc.DocumentElement;
_name = root.Attributes ["nom"].Value; _name = root.Attributes ["nom"].Value;
@ -340,6 +367,7 @@ namespace DMX2
seqmaitre = SequenceurMaitre.Load(this,root["SequenceurMaitre"]); seqmaitre = SequenceurMaitre.Load(this,root["SequenceurMaitre"]);
StartThread();
} }
#endregion #endregion

View file

@ -18,8 +18,8 @@
<DefineConstants>DEBUG;</DefineConstants> <DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<Externalconsole>true</Externalconsole>
<Commandlineparameters>fullscreen aguibtn</Commandlineparameters> <Commandlineparameters>fullscreen aguibtn</Commandlineparameters>
<ConsolePause>false</ConsolePause>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<DebugType>none</DebugType> <DebugType>none</DebugType>

View file

@ -217,7 +217,8 @@ namespace DMX2
void IEventProvider.ProcessEvents (EventManagerCallback callback) void IEventProvider.ProcessEvents (EventManagerCallback callback)
{ {
buttonState bt; string id; EventData evd; buttonState bt;
EventData evd;
while (eventsPending.TryDequeue(out bt)) { while (eventsPending.TryDequeue(out bt)) {
evd.id= string.Format("BV1-B{0}",bt.button ); evd.id= string.Format("BV1-B{0}",bt.button );
evd.value = bt.pressed?(byte)0xFF:(byte)0x00; evd.value = bt.pressed?(byte)0xFF:(byte)0x00;

View file

@ -391,7 +391,7 @@ namespace DMX2
stream.Close(); stream.Close();
} }
Conduite cond = Conduite.Load(doc); Conduite cond = new Conduite(doc);
if (cond==null) if (cond==null)
{ {
// TODO Message erreur au chargement // TODO Message erreur au chargement

View file

@ -270,7 +270,7 @@ namespace DMX2
public override int ValeurCircuit (Circuit c) public override int ValeurCircuit (Circuit c)
{ {
lock(this) { lock(this) {
if (!circuitsSeq.Contains (c)) if (!valeurscourantes.ContainsKey (c))
return 0; return 0;
if (master != 100) if (master != 100)
return valeurscourantes [c] * master / 100; return valeurscourantes [c] * master / 100;

View file

@ -291,7 +291,7 @@ namespace DMX2
public override int ValeurCircuit (Circuit c) public override int ValeurCircuit (Circuit c)
{ {
if (!circuitsSeq.Contains (c)) if (!valeurscourantes.ContainsKey (c))
return 0; return 0;
if(master !=100) if(master !=100)
return valeurscourantes [c] * master /100; return valeurscourantes [c] * master /100;
@ -313,14 +313,17 @@ namespace DMX2
lock (this) { lock (this) {
List<Circuit> circuits = new List<Circuit> (effetsEnCours.Keys); if(effetsEnCours.Count>0)
{
List<Circuit> circuits = new List<Circuit> (effetsEnCours.Keys);
foreach (Circuit c in circuits) { foreach (Circuit c in circuits) {
if (effetsEnCours [c].Incremente (time)) { if (effetsEnCours [c].Incremente (time)) {
valeurscourantes [c] = effetsEnCours [c].ValeurFinale; valeurscourantes [c] = effetsEnCours [c].ValeurFinale;
effetsEnCours.Remove (c); effetsEnCours.Remove (c);
} else { } else {
valeurscourantes [c] = effetsEnCours [c].ValeurCourante (); valeurscourantes [c] = effetsEnCours [c].ValeurCourante ();
}
} }
} }
} }