[C#] Plantage de l'os à la fermeture de l'application

Signaler
Messages postés
172
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2011
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
Bonjour,
Je m'explique, j'ai une applie qui, à la fermeture - soit par la croix, soit par menu quitter - plante et plante l'os et cela est systématique sous 98, de temps en temps sous 2000 et n'arrive pas sous XP.

quelqu'un aurait-il une idée.

Merci

CedKat

16 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
Quel traitement fais-tu à la fermeture de ton application ?

Sébastien FERRAND
Messages postés
172
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2011

Bonjour


Voici mon code :


private void frmTracerVin_Closing(object sender,System.ComponentModel.CancelEventArgs e)
{
try
{
TSérialisation.SaveBinaryData(FParamètres,FFilenameParam) ;
mnuEnregistrer_Click(null,null) ;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message) ;
}
}
private void mnuEnregistrer_Click(object sender, System.EventArgs e)
{
this.Cursor = Cursors.WaitCursor ;
if (FFileNameDossier != "") TSérialisation.SaveBinaryData FDossier,FFileNameDossier) ;
this.Cursor = Cursors.Default ;
}


public static void SaveBinaryData(object data, string filename)
{
BinaryFormatter sf = new BinaryFormatter() ;
FileStream fs = new FileStream(filename,FileMode.Create) ;
sf.Serialize(fs,data) ;
fs.Close() ;
}


Voilà. merci

CedKat
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
déjà, une remarque :
on écrit pas : mnuEnregistrer_Click(null,null) ;
mais : mnuEnregistrer_Click(this, EventArgs.Empty) ;

deuxiemement :
private void frmTracerVin_Closing(object sender,System.ComponentModel.CancelEventArgs e)
{
try
{
TSérialisation.SaveBinaryData(FParamètres,FFilenameParam) ;
mnuEnregistrer_Click(null,null) ;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message) ;
}
}

je coderais de la manière suivante :
private void frmTracerVin_Closing(object sender,System.ComponentModel.CancelEventArgs e)
{
try
{
TSérialisation.SaveBinaryData(FParamètres,FFilenameParam) ;
mnuEnregistrer_Click(this,EventArgs.Empty) ;
e.Cancel = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message) ;
e.Cancel = true;
}
}

Sébastien FERRAND
Messages postés
172
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2011

Bonjour,

Merci pour les infos, mais ça plante toujours. Rien n'est capturé le try catch. La fenètre principal se ferme et là plus rien.

CedKat
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
Troisièmement c'est super moche les variables avec des accents ...

Sinon tu fais tu multithreading ? du socket ? du remoting ? dans ton application ?
Messages postés
172
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2011

Bonjour,
C'est une histoire de gout les accents ...
Pour ce qui est de mon appli, rien de tout ça, c'est juste de la saisie d'info que je sauvegarde par sérialisation.

CedKat
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
as-tu essayé de mettre des points d'arrêts pour regarder où ca plante ?

Sébastien FERRAND
Messages postés
172
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2011

Je développe sous XP, et dans ce contexte, le problème ne se pose pas. Cela fait planté l'os sous 98 hors pas possible de débugage sous cette platforme.

CedKat
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
je pense qu'il y a un problème au niveau de la libération des ressources.
essaye de mettre ceci à la fin de SaveBinaryData :

Application.DoEvents();
fs.Dispose(); // NE JAMAIS OUBLIER LE Dispose() ;)
Application.DoEvents();

Sébastien FERRAND
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
La méthode Close appelle Dispose.
Messages postés
172
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2011

Bonjour

fs est liestream et ne dispose pas de méthode Dispose()

CedKat
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
ooops... j'avais pas vu qu'elle était protected

sinon, essaye ceci :

public static void SaveBinaryData(object data, string filename)
{
BinaryFormatter sf = new BinaryFormatter() ;
FileStream fs = new FileStream(filename,FileMode.Create) ;
sf.Serialize(fs,data) ;
fs.Close() ;
fs = null;
sf = null;
}

Sébastien FERRAND
Messages postés
172
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2011

Bonjour

Ca ne change rien. Je viens de metre en commentaire ma méthode closing mais ca plant l'os comme même.

CedKat
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
je pense que l'on ne cherche pas au bon endroit.

as-tu d'autres ressources ouvertes dans ton programme ?
- thread ;
- socket ;
- bref, tout ce qui peut planter...

Sébastien FERRAND
Messages postés
172
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2011

Tout ce que j'utilise, ce sont des assemblys qui contient des données sérialisées et donc les seul accées externe sont le dossier qui est lui même sérialisée et dont on a regarder la méthode d'enregistrment plus haut.Normalement les assembly doivent être gérer par le framwork. Donc je ne vois pas.!!

CedKat
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Petite précision sur Dispose ( .Net 2.0 ), FileStream a une méthode Dispose, elle n'est pas protected mais c'est un membre d'interface explicite. Ca ne change rien mieux vaut appeller Close, mais on comprends mieux pourquoi on peut utiliser using( .. ) { ... } avec un FileStream. ; )

( ( IDisposable )fs ).Dispose( ); // Appel explicite