From afc21dccf0f2119cf6259e42a40efc84c319c1c8 Mon Sep 17 00:00:00 2001 From: tzim Date: Thu, 21 Nov 2013 10:59:26 +0000 Subject: [PATCH] * Conduite.cs: Amelioration de la boucle (precision du timing) Gestion simple des erreurs dans la boucle * Main.cs: Gestion des erreurs de l'interface * Info.cs: les infos persistent 5s au lieu de 3 --- DMX-2.0/Conduite.cs | 36 ++++++++++++++++++++++++++---------- DMX-2.0/Info.cs | 2 +- DMX-2.0/Main.cs | 21 +++++++++++++++++++++ 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/DMX-2.0/Conduite.cs b/DMX-2.0/Conduite.cs index 0338648..dad6041 100644 --- a/DMX-2.0/Conduite.cs +++ b/DMX-2.0/Conduite.cs @@ -177,19 +177,36 @@ namespace DMX2 } } + // On utilise un thread qui boucle au lieu d'un timer. - // C'est moins précis, mais ca consomme beaucoup moins de ressources + // C'est un peu moins précis, mais ca consomme beaucoup moins de ressources + + + const int LOOPTIME = 10; + void ThreadLoop () { Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; - TimeSpan delay = TimeSpan.FromMilliseconds(10); - TimeSpan sleeptime; int i=0; + DateTime next; while (running) { - Tick(); - sleeptime = delay.Subtract(DateTime.Now - dernierTick); - if(sleeptime > TimeSpan.Zero) - Thread.Sleep(sleeptime); + + try{ + Tick(); + } + catch (Exception ex) // Gestion d'erreurs ... au cas ou ... on affiche et on continue + { + Info.Publish(ex.ToString()); + } + + next = dernierTick.AddMilliseconds (LOOPTIME); + while (DateTime.Now< next) Thread.Sleep(1); + + // Version plus précise, si besoin : +// next = dernierTick.AddMilliseconds (LOOPTIME-1); +// while (DateTime.Now< next) Thread.Sleep(1); +// next = dernierTick.AddMilliseconds (LOOPTIME); +// while (DateTime.Now TimeSpan.FromMilliseconds (12)) +// if (deltaT > TimeSpan.FromMilliseconds (LOOPTIME+2)) Info.Publish(string.Format ("{0}", deltaT)); lock (this) { @@ -239,10 +256,9 @@ namespace DMX2 EventManager.ProcessEvents(); } - // Cette fonction retourne quasi immédiatement, même si il y'a beaucoup a faire sur l'affichage } - + // Cette fonction retourne quasi immédiatement, même si il y'a beaucoup a faire sur l'affichage if(tickTime - derniereMaj > TimeSpan.FromMilliseconds(50)){ MainWindow.Win.ScheduleUpdate(); derniereMaj = DateTime.Now; diff --git a/DMX-2.0/Info.cs b/DMX-2.0/Info.cs index 0d845d3..bfe033f 100644 --- a/DMX-2.0/Info.cs +++ b/DMX-2.0/Info.cs @@ -8,7 +8,7 @@ namespace DMX2 static string lastinfo = string.Empty; static public void Publish(string info) { - last = DateTime.Now.AddSeconds(3); + last = DateTime.Now.AddSeconds(5); lastinfo = info; } static public string GetInfo(){ diff --git a/DMX-2.0/Main.cs b/DMX-2.0/Main.cs index 54644b2..6921a0a 100644 --- a/DMX-2.0/Main.cs +++ b/DMX-2.0/Main.cs @@ -52,6 +52,9 @@ namespace DMX2 if(fullscreen) win.ToggleFullscreen(); if(aguibtn) win.AfficheBoutonACGUI(); + // Gestion des erreurs non traitées dans l'interface + GLib.ExceptionManager.UnhandledException += HandleUnhandledException; + // Lancement win.Show (); Application.Run (); @@ -61,5 +64,23 @@ namespace DMX2 Conduite.Courante.Dispose (); } } + + static void HandleUnhandledException (GLib.UnhandledExceptionArgs args) + { + + // En cas d'erreur non traitée : on affiche et on demande ... + var dlg = new Dialog ("Erreur !", null, DialogFlags.Modal); + + dlg.AddButton ("Continuer ..." , ResponseType.Cancel ).GrabDefault(); + dlg.AddButton ("Fermer l'application" , ResponseType.Close ); + + dlg.VBox.Add (new Label (args.ExceptionObject.ToString())); + dlg.VBox.ShowAll (); + + // Si l'utilisateur a clique sur le bon bouton, on continue comme si de rien n'etait... + args.ExitApplication= (ResponseType)dlg.Run() == ResponseType.Close ; + dlg.Destroy(); + + } } } \ No newline at end of file