Boucle infinie sur un singleton au démarrage

Résolu
Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 - 2 juil. 2013 à 22:25
Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 - 4 juil. 2013 à 11:18
Salut à tous,
Bon, mon problème n'est pas simple à expliquer, d'autant que je ne sais pas vraiment quoi afficher comme code (Cela dit, si je savais, j'aurai déjà trouvé la solution 8:) )

Alors
Dans mon main,
1- Je charge les données d'un fichier xml
2- j'appelle une fonction fct1, qui est dans Program.cs, une fois, si le fichier est vide(Dans le même thread), sinon, autant de fois qu'il y a d'objets dans mon fichier xml(Dans des threads différents)
3- Je lance un "Application.Run()"
4- Cette fonction fct1 appelle un singleton, qui lui même appelle un form et un notifyicon.

Dans certains cas, le programme semble tomber dans une boucle infinie de création de form et de notifyicon (Il m'en génère une bonne centaine avant de crasher!)
C'est systématique si mon programme se lance au démarrage.
Sinon, c'est plus ou moins aléatoire (Même si j'ai l'impression que ca arrive plus facilement quand la ram de l'ordi est prise.)
Un seul démon est lancé, que je supprime dans le taskmanager pour éviter le crash.
Mon fichier xml contient au maximum une 20aine d'objets, donc chaque instance de form et notifyicon créé ne correspond en aucun cas à chaque objet.
Je suis sous Win7 64bits.
Je programme sous Net 4.0, avec Visual Studio 2010 Express
Voilà, bien sur si vous avez besoin d'autres infos, voir d'une partie du code, y a pas de soucis.
Merci beaucoup de votre aide.

@+. Hermios

12 réponses

Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 2
4 juil. 2013 à 11:18
Salut,
Donc la solution était: Appel récursif de mon singleton... dans le constructeur lui même!
Comme la variable instance n'était alors pas encore créé, puisque le constructeur n'avait pas fini toutes ces lignes, cela créeait un nouvel objet!
Quant à trouver l'appel récursif, il était en fait du à une autre classe, qui affichait des données dans le form, lequel réagissait par erreur en demandant à la même classe de sauvegarder ces données, et d'afficher une info... dans le form (donc en rappelant le singleton pour avoir accès au form).
Bon, pour une fois, c'était pas la faute bête par excellence! :D
Quoiqu'il en soit, merci à vous deux pour vos réponses.

@+Hermios


@+. Hermios
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
3 juil. 2013 à 10:28
Il faut remonter la trace d’exécution de ton code

le programme semble tomber dans une boucle infinie de création de form et de notifyicon

Il te faut commencer par recenser tous les codes qui ouvrent explicitement cette form (les form.show de cette form par exemple). Il te faut ensuite savoir ou, pourquoi, et comment son exécutés/appelés ces codes et remonter ainsi toutes les chaines possibles des appels.

Tu vas avoir au final, certainement, plusieurs causes possibles à analyser.

Une piste : Tu dis qu'un singleton ouvre la form et le notifyicon. Comment ce singleton le fait-il ? Ce singleton est-il utilisé ailleurs (sur la form?) de sorte qu'il puisse à nouveau ouvrir la form et le notifyicon ? etc..etc..


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 2
3 juil. 2013 à 11:23
Salut Casy,
Merci beaucoup pour ta réponse.
Donc comme prévu, j'ai oublié des informations importantes :)
Le notifyicon et le form ne sont construits que dans le constructeur du singleton.
Le singleton est "appelé" à beaucoup d'endroits, mais comme il s'agit d'un singleton, normalement (enfin, si j'ai bien compris), le constructeur lui ne devrait être appelé qu'une seule fois.
En fait, j'ai l'impression que le programme ne "voit pas" que la commande a été lancée, et ne voit pas que l'instance de mon singleton n'est pas nulle.
Ne connaissant pas tous les mécanismes des variables statiques, je me dis que c'est peut être possible. Mais comment? Et surtout, comment le réparer?
Merci

@+. Hermios
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
3 juil. 2013 à 13:50
Dans ce cas le constructeur de ton singleton doit être appelé plusieurs fois sans doute.

Le problème vient sans doute, soit de la façon dont est codé ton singleton, soit de la façon dont tu l'utilise ensuite dans ton code


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 2
3 juil. 2013 à 14:18
Le singleton est codé de la manière suivante :

static Singleton _instance;
NotifyIcon ni = new NotifyIcon();
Form myForm;
private Singleton()
{
myForm=new Form();
ni.Visible=true;
myForm.eventAction+=new ActionHandler(form_ActionHandler);
}
public static Singleton getInstance()
{
if (_instance == null)
_instance = new Singleton();
return _instance;
}

Je l'ai remanié, pour le simplifier pour le visuel, mais je pense qu'il y a ici tout ce qui pourrait être intéressant!
Est-ce faux?

Merci

@+. Hermios
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
3 juil. 2013 à 15:22
Ca me semble bon.

Ensuite dans le reste du code, à l'utilisation du singleton, tu ne dois jamais faire appel au constructeur du singleton, jamais faire un new Singleton

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 2
3 juil. 2013 à 15:36
J'a bien vérifié, via Visual Studio, le constructeur n'est appelé que dans le singleton...


@+. Hermios
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
3 juil. 2013 à 17:12
Là, je sais pas.

Essaye en mettant un point d’arrêt dans le constructeur de ton singleton pour voir si effectivement il n'est appelé qu'une seule fois



[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
3 juil. 2013 à 17:13
ou un Debug.Print


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 2
3 juil. 2013 à 17:27
Malheureusement, comme j'ai dit, ca se reproduit essentiellement quand je lance l'appli (installée via un setup) au démarrage de Windows. En fait, là où il lance toutes les applis, donc je pense au moment où le proc est le plus chargé. Une solution pour tester : Simuler un proc chargé (en supposant que ce soit la raison pour laquelle ca fait ca). Une idée pour faire ca?


@+. Hermios
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
3 juil. 2013 à 20:07
Bonsoir, je n'ai pas la solution pour simuler un proc chargé, mais si tu veux voir combien de fois le constructeur de Singleton est appelé, tu peux y mettre une ligne qui écrit l'heure dans un fichier texte.
Il te suffira de le consulter après un crash.



Whismeril
0
Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 2
3 juil. 2013 à 23:07
Salut Wishmeril
Excellente idée, je vais essayer!
Merci!

@+. Hermios
0
Rejoignez-nous