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

Messages postés
265
Date d'inscription
dimanche 14 avril 2013
Dernière intervention
23 mai 2014
- 2 juil. 2013 à 22:25 - Dernière réponse :
Messages postés
265
Date d'inscription
dimanche 14 avril 2013
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
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
265
Date d'inscription
dimanche 14 avril 2013
Dernière intervention
23 mai 2014
- 4 juil. 2013 à 11:18
3
Merci
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

Merci Hermios 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de Hermios
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- 3 juil. 2013 à 10:28
0
Merci
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
Commenter la réponse de cs_casy
Messages postés
265
Date d'inscription
dimanche 14 avril 2013
Dernière intervention
23 mai 2014
- 3 juil. 2013 à 11:23
0
Merci
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
Commenter la réponse de Hermios
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- 3 juil. 2013 à 13:50
0
Merci
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
Commenter la réponse de cs_casy
Messages postés
265
Date d'inscription
dimanche 14 avril 2013
Dernière intervention
23 mai 2014
- 3 juil. 2013 à 14:18
0
Merci
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
Commenter la réponse de Hermios
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- 3 juil. 2013 à 15:22
0
Merci
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
Commenter la réponse de cs_casy
Messages postés
265
Date d'inscription
dimanche 14 avril 2013
Dernière intervention
23 mai 2014
- 3 juil. 2013 à 15:36
0
Merci
J'a bien vérifié, via Visual Studio, le constructeur n'est appelé que dans le singleton...


@+. Hermios
Commenter la réponse de Hermios
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- 3 juil. 2013 à 17:12
0
Merci
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
Commenter la réponse de cs_casy
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- 3 juil. 2013 à 17:13
0
Merci
ou un Debug.Print


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Commenter la réponse de cs_casy
Messages postés
265
Date d'inscription
dimanche 14 avril 2013
Dernière intervention
23 mai 2014
- 3 juil. 2013 à 17:27
0
Merci
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
Commenter la réponse de Hermios
Messages postés
12267
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 novembre 2018
- 3 juil. 2013 à 20:07
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
265
Date d'inscription
dimanche 14 avril 2013
Dernière intervention
23 mai 2014
- 3 juil. 2013 à 23:07
0
Merci
Salut Wishmeril
Excellente idée, je vais essayer!
Merci!

@+. Hermios
Commenter la réponse de Hermios

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.