[C#]Comment arreter proprement une application C#

Je débute dans le C#, langage qu’on me donne la possibilité d’apprendre via mon taf actuel, en me donnant a faire des interfaces de communication usb/serie. Et l’avantage, c’est qu’on me donne bien le temps de peaufiner mes tests, mon apprentissage et mon soft final pour avoir un logiciel utilisable (ben ouais).
J’ai pas encore bien compris l’intérêt de l’objet (meme si ca commence) et encore moins l’intérêt des interfaces (même si j’ai utilisé ICloneable dans un autre projet) mais j’imagine que ca va venir.

Pour l’instant, je cherche a fermer proprement mon application (un exit(0) en somme) et faire en sorte que ca ne plante pas l’application.
Je vous explique le fonctionnement général de l’application.

Sur mon projet, j’ai 3 forms
_Une form de detection COM (avec une barre de progression pour informer du scan des ports com et qui attends une data pour dire « ah ben c’est lui le bon port com »)
_Une form d’option (pour forcer le com)
_Une form principale.

Dans la methode « form_load » de la form principale, c’est ici que je cree ma form de détection com et que je l’exécute avant l’affichage de la form principale. Celle ci détecte les port com et stock dans une variable public le « bon port com » que je récupère en faisant:

DetectedCom= form_comdetect.ResultCom;

D’ailleurs, ca marche un peu magiquement parce qu’il suffit que je fasse

this.Hide(); return;
pour que le contrôle soit rendu a la form principale. D’ailleurs, vous notez que j’ai fait Hide et pas close, tout simplement parce que si je close, je ne pourrais plus lire ma donnée form_detect.ResultCom.
Je pense donc ici que je n’utilise pas forcement la bonne methode de gestion des form et que, peut etre, cela a un lien avec le probleme que je vais vous exposer maintenant. (la form d’option etant géré de la même manière)

_Le programme fonctionne parfaitement sur mon pc (xp pro)
_Idem sur vista
_Il peut (c’est pas systématique) faire un « hang » quand on clique sur le bouton rouge X en haut a droite de l’application sur le pc du chef de projet (ouais c’est con). Ce pc est équipé de la bonne version de .Net.

Donc j’ai investigué et j’ai vu que ma fonction d’arrêt ne fermait pas tout proprement. Donc j’ai fait en sorte qu’elle le fasse:

[code] void endofrun()
{
//software will end here: we need to close all the open thingies

		//close the tick
		graphe_time.Enabled = false;

		//The datafile, if there is something we are still logging:
		if (datafile != null)
		{
			datafile.Close();
			datafile = null;
		}
		//close the com port.
		sport.Close();
		
		//close the forms
		form_options.Close();
		form_comdetect.Close();

		//force close.
		Environment.Exit(0);
		//Application.Exit();

	}[/code] 

J’ai essaye les deux, Environment.Exit(0); et Application.Exit(); et ca ne change pas grand chose au problème, sachant qu’effectivement, j’ai pas compris la diff malgré la relecture de la doc. Plus précisément, j’ai compris le texte mais ca donne pas les résultats que j’aurais cru, notamment application.exit qui, des fois, exit pas. D’ailleurs, je suis en winform et je devrais pas utiliser Environment.Exit(0), mais l’utilisation de Application.Exit() ne change rien a mon problème.
La ou ca devient rigolo, c’est que j’ai créé un bouton « Quitter » qui est censé quitter l’application. Celui ci lance bêtement endofrun().
Quand, sur le pc du chef, on clique sur « quitter », ca marche a tout les coups. Si on clique sur la X rouge, ca hang 9 fois sur 10.

Ok donc j’utilise pas le bon événement lié a la X rouge pour lancer endofrun(). J’ai utilise les événements FormClosing, Leave et FormClosed. Ce dernier permet d’avoir un hang 9 fois sur 10 au lieu de 10 fois sur 10. J’ai aussi mis aucun événement et ca fait du 10/10 hanged. J’ai pas trouvé sur le net une info "la X rouge est lie a l’événement truc…

Pour apprendre le C#, j’ai utilisé les video qui etaient fourni sur le site de MS (que je retrouve plus, dommage c’etait bien fait) et le cours online de Serge Tahe, parfait pour les bases mais dans lequel il manque l’utilisation standard des forms (le basic est traite sur les video MS).

Donc en fait, y a deux questions:
_Ou est ce que je merde dans la fermeture de l’appli (qui marche sur mon pc et sur un pc vista), et quel moyen j’aurais pour tester tout ca?
_Une (bonne) référence sur les winforms, gratuite si possible?

merci d’avance pour tout piste, la plus insignifiante possible :smiley:

LoneWolf
I want to know how deep the C# hole goes.

Je vois pas pourquoi, meme une fois closed, tu pourras lire la valeur. Limite meme si c’est pas super propre, une fois disposed, elle devrait y etre encore. Et pourquoi tu fais pas un showdialog tout simplement ?

[quote=« LoneWolf, post:1, topic: 50977 »]Donc en fait, y a deux questions:
_Ou est ce que je merde dans la fermeture de l’appli (qui marche sur mon pc et sur un pc vista), et quel moyen j’aurais pour tester tout ca?
_Une (bonne) référence sur les winforms, gratuite si possible?[/quote]

Normalement, tu fais dans ton main un Application.Run(new MaForm()); Le reste est automatique :smiley:
Pour la reference, un peu n’importe quel bouquin avec C# et/ou winforms dans le titre fera l’affaire pour degrossir la base. La MSDN et le net, c’est tres bien aussi :smiley:

j’execute ma form avec showdialog et je rends la main apres, en faisait hide dans la form.

[quote=« AnA-l, post:2, topic: 50977 »]Normalement, tu fais dans ton main un Application.Run(new MaForm()); Le reste est automatique :smiley:
Pour la reference, un peu n’importe quel bouquin avec C# et/ou winforms dans le titre fera l’affaire pour degrossir la base. La MSDN et le net, c’est tres bien aussi :)[/quote]
Depuis que j’ai fait la method de fermeture, ca plante moins statistiquement. Et puis j’ai mes vieux fantomes d’ASP qui ressortent, ou on m’avait dit aussi que c’etait automatique alors qu’en fait, ca l’etait pas vraiment :slight_smile:

Mais ok je regarde ca merci :smiley:

LoneWolf
Level up

Normalement, tu montres ta form avec un ShowDialog externe, et tu la close() elle meme. Et c’est tout :smiley:
Pour le reste, c’est quand meme assez different d’asp hein. Mais franchement, tu dois etre le seul mec chez qui ca plante :x

Les interfaces ça permet de faire plusieurs trucs : par exemple avoir des implémentations différentes pour les mêmes opérations.
Exemple, tu te fais une bibliothèque de trI; bah tu va faire une interface Tri avec une methode très originale, genre trier().

Puis de là tu va pouvoir te faire une classe TriDébile TriMoinsDébile mais qui resterons des objets Tri.

Un autre exemple tout aussi mauvais?
Tu veux ranger dans un tableau de gens. Pourquoi des gens? Parceque tu veux pouvoir faire un getPrenom() dessus.
Sauf qu’on t’as dit qu’en Objet, les types c’était lebien.
Donc par exemple tu va faire une interface Gens, avec la méthode getPrenom() que tu va hériter en GensMonsieur et GensMadame. Mais dans ton tableau (ou whatever), tu peux quand même faire montableau et y mettre des monsieurs et des madames.

C’est juste une abstraction.

Une interface c’est un contract qui définit ce qu’un object peut faire. L’object peut avoir plusieurs rôles differents et donc plusieurs interfaces.
Mais ça décrit pas comment il le fait, ni si il le fait bien.

ex: La classe Zidane implemente l’interface footballeur, donc il peut faire du foot. La classe MickaelJordan implement l’interface Basketeur, il peut donc jouer avec les mains au baskets.

Et la classe ThierryHenry implemente les interfaces Footballeur et Basketeur il peut donc jouer au foot et au basket. :smiley:

Hide c’est mal.

[quote=« Dadal, post:6, topic: 50977 »]ex: La classe Zidane implemente l’interface footballeur, donc il peut faire du foot. La classe MickaelJordan implement l’interface Basketeur, il peut donc jouer avec les mains au baskets.

Et la classe ThierryHenry implemente les interfaces Footballeur et Basketeur il peut donc jouer au foot et au basket. :D[/quote]
Mortel l’exemple :smiley:

Encore un qui abuse des interfaces :smiley:

[quote=“Dadal, post:6, topic: 50977”]ex: La classe Zidane implemente l’interface footballeur, donc il peut faire du foot. La classe MickaelJordan implement l’interface Basketeur, il peut donc jouer avec les mains au baskets.

Et la classe ThierryHenry implemente les interfaces Footballeur et Basketeur il peut donc jouer au foot et au basket. :D[/quote]
J’adore !

Juste un truc: ICloneable est déconseillée parce que personne ne sait si ca doit faire un shallow copy (copie des objets de la classe elle même seulement) ou un deep copy (copie récursive des objets).

Sinon, GG, le C# c’est vraiment un bon langage :D. Et mon paternel suit approximativement le même chemin que toi (pilotage de composants I2C via sériel/USB).

[quote=« AnA-l, post:4, topic: 50977 »]Normalement, tu montres ta form avec un ShowDialog externe, et tu la close() elle meme. Et c’est tout :smiley:
Pour le reste, c’est quand meme assez different d’asp hein. Mais franchement, tu dois etre le seul mec chez qui ca plante :x[/quote]
Est ce que ca peut venir d’un framework mal installe? ou d’une succession d’installation du FW qui fait tout planter. Sachant que le XP sur lequel ca plante a facilement 5 ans et n’a jamais vraiment été entretenu.

Sinon pour mes questions, je vais faire un thread séparé, ca sera plus simple a gérer.

edit:

Euh ouais? tu utilise quoi alors pour cloner tes objets alors?

LoneWolf
Je suis quand même plus enclin a considérer que ca vient de mon code plutôt que du FW

Ca peut venir d’un framework mal installé, mais c’est assez peu probable. Testes en debug, voir le souci, a la fin de ton truc, tu mattes si t’as des threads qui trainent deja.