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; } }
|
||||
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue