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; } }
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

View file

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

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -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<Circuit> circuits = new List<Circuit> (effetsEnCours.Keys);
if(effetsEnCours.Count>0)
{
List<Circuit> circuits = new List<Circuit> (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 ();
}
}
}
}