Boucle infinie sur un singleton au démarrage [Résolu]

Signaler
Messages postés
264
Date d'inscription
dimanche 14 avril 2013
Statut
Membre
Dernière intervention
23 mai 2014
-
Messages postés
264
Date d'inscription
dimanche 14 avril 2013
Statut
Membre
Dernière intervention
23 mai 2014
-
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

Messages postés
264
Date d'inscription
dimanche 14 avril 2013
Statut
Membre
Dernière intervention
23 mai 2014
2
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
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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
Messages postés
264
Date d'inscription
dimanche 14 avril 2013
Statut
Membre
Dernière intervention
23 mai 2014
2
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
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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
Messages postés
264
Date d'inscription
dimanche 14 avril 2013
Statut
Membre
Dernière intervention
23 mai 2014
2
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
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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
Messages postés
264
Date d'inscription
dimanche 14 avril 2013
Statut
Membre
Dernière intervention
23 mai 2014
2
J'a bien vérifié, via Visual Studio, le constructeur n'est appelé que dans le singleton...


@+. Hermios
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
ou un Debug.Print


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
264
Date d'inscription
dimanche 14 avril 2013
Statut
Membre
Dernière intervention
23 mai 2014
2
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
Messages postés
14776
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 septembre 2020
435
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
Messages postés
264
Date d'inscription
dimanche 14 avril 2013
Statut
Membre
Dernière intervention
23 mai 2014
2
Salut Wishmeril
Excellente idée, je vais essayer!
Merci!

@+. Hermios