2011-04-16 4 views
1

Il y a plusieurs années, je l'ai écrit cette application Roulette sur .NET 1.1 en utilisant C# et Visual Studio.net: http://www.lonniebest.com/Roulette/De .NET à Mono - Un accident tout en martelant WinForms

Depuis Avril 2007, je me sers Ubuntu Linux exclusivement, alors aujourd'hui, j'ai essayé de recompiler ce vieux code en utilisant l'IDE MonoDevelop. À ma grande surprise, le code s'est bien construit sans erreurs, et j'ai pu exécuter cette application Windows Forms sur Ubuntu.

Tout a bien fonctionné (au début), quand je tournais la roue de la roulette un tour à la fois. Cela fonctionnerait même bien si je le disais de le faire tourner 10 fois de suite. Cependant, trop élevé (dans une rangée) que, les applications se bloque et tout ce que je vois dans le volet « Sortie d'application » du MonoDevelop est:

The application was terminated by a signal: SIGHUP 

(Dans Visual Studio, je vous attendez à me diriger Une exception non gérée dans mon code, mais MonoDevelop semble seulement afficher la sortie ci-dessus dans le volet "Sortie d'application".)

Cette application martèle vraiment Windows Forms, elle met à jour de nombreux éléments de forme encore et encore à chaque spin, aussi vite que possible. Si vous l'exécutez sur la version .NET que j'ai publiée dans le lien ci-dessus, vous verrez qu'elle met à jour tous ces éléments de formulaire 100 fois par seconde. Ce n'est peut-être pas nécessaire, mais la demande dans son ensemble ne l'est pas non plus, et c'est ce que j'ai l'intention de faire.

Compilé avec Visual Studio et fonctionnant sous Windows .NET, les applications peuvent effectuer des millions de tours sans se bloquer. Alors, qu'est-ce qui pourrait me permettre de rendre ce code plus résilient dans Mono/Linux, à la lumière du crash "SIGHUP" ci-dessus?

J'ai joint la solution MonoDevelop à ce rapport de bogue: https://bugzilla.novell.com/show_bug.cgi?id=688014

+1

Une chose que je peux dire au sujet de votre Roulette ... Je n'est pas biaisé sûr .. :-P –

+1

fichier Plase un rapport de bogue sur le tracker Mono et fixez votre code. – skolima

+1

Avez-vous utilisé l'outil Moma? Voir http://www.mono-project.com/MoMA – sehe

Répondre

2

La preuve suivante concept montre que cela est probablement l'utilisation de la promiscuité Windows Forms contrôles à partir d'un fil non-UI. Cette preuve de concept est complètement braindead, parce que je ne voulais pas exactement savoir quelles lignes dans votre fonction DisplayResults de 328 lignes étaient le coupable. Vous pouvez utiliser les liens ci-dessous pour alléger votre situation.

Lire sur les arrière-plans ici:

Le patch suivant supprime complètement les symptômes pour moi.

diff --git a/Roulette/Roulette.cs b/Roulette/Roulette.cs 
index d5ede34..ae098ac 100644 
--- a/Roulette/Roulette.cs 
+++ b/Roulette/Roulette.cs 
@@ -402,6 +402,7 @@ namespace Roulette 
         // 
         // TODO: Add any constructor code after InitializeComponent call 
         // 
+      Application.Idle += (sender, e) => DisplayResultsEx(); 
       } 

       /// <summary> 
@@ -5135,6 +5136,11 @@ namespace Roulette 

       public void DisplayResults() 
       { 
+ 
+    } 
+ 
+    private void DisplayResultsEx() 
+    { 
         //Display the current result. 
         lblCurrentResult.Text = m_Wheel1.CurrentResult.Name; 
+0

Je n'ai pas encore appliqué votre patch, mais j'ai l'intention de le faire tard ce soir. Merci d'avoir pris le temps de préciser ce point pour moi. Je voudrais avoir vos compétences de débogage. Je n'ai aucune idée de comment vous avez compris cela, mais j'apprécie! –

+1

J'ai vu l'utilisation de threads, je l'ai vu échouer dans DisplayResults et vu qu'il accède aux contrôles de l'interface utilisateur sur le thread non-UI. Il est temps de vérifier si tout cela est threadsafe (documentation à la rescousse) :) – sehe