Amélioration des perfs
This commit is contained in:
parent
5e8a8f6095
commit
aa3d405b6c
6 changed files with 85 additions and 53 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue