Unload me qui fait planter VB

Résolu
Signaler
Messages postés
6
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
4 mars 2008
-
Messages postés
6
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
4 mars 2008
-
Bonjour tout le monde,


J'espère que voue pourrez m'aider pour un problème qui parait tout bête mais pourtant...


Contexte : Je dois développer un petit soft pour un client permettant
de faire des acquisitiosns de données via une carte PCI propriétaire et
des ports séries. J'"utilise sous VB6 SP6.

Jusque la tout va bien...


Problème : Dans une fenêtre MDIChild (à priori ca n'a rien à voir avec
le probléme), lorsque je souhaite la décharger par la fonction "Unload
Me", VB "tourne en rond" c'est à dire qu'il plante, plus possible de
faire quoi que ce soit mis à part tuer la tâche dans les processus
Windows.

Fonctionnement : Alors pour faire simple, c'est une fenêtre qui permet d'enregistrer des "Préférences" dans un fichier texte tout simple.


Il y a deux champs pour des déplacements d'un four (mini et maxi), deux
champs pour les déplacements d'un échantillon (mini et maxi), et une
liste box pour le genre de thermocouple utilisé pour les relevés de
température.


Si l'utilisateur change le type de thermocouple, on change les
paramètres de 3 conditionneurs de type LOREME CNL35 (on s'en fout...)
via une RS232. Pour se faire une fenêtre s'ouvre (pas en MDI celle ci)
dans laquelle on voit les trames de dialogues entre le PC (appli VB) et
les conditionneurs, si ca se passe bien on ferme la fentre de
configuration pour revenir a la fenetre des preferences, si ca se passe
mal, il y a un message d'erreurs qui apparait sur la fenetre de
configuration des conditionneurs, et un bouton quitter qui permet de
sortir de cette vue et de revenir sur la vue des "preferences".


C'est à ce moment la que ca se corse, car à partir de maintenant, quand
je souhaite decharger la vue "Preferences", VB plante sur Unload Me.

Code :

PrivateSub BTC_Annuler_Click()
'Ferme la vue sans valider les modifications
Unload Me
ExitSub
EndSub
 
PrivateSub BTC_OK_Click()
Dim l_MemoThermocouple AsString
 
l_MemoThermocouple = G_PreferenceTypeThermo
 
SelectCase CB_Thermocouple.ListIndex
Case0
G_PreferenceTypeThermo = "K"
Case1
G_PreferenceTypeThermo = "B"
Case2
G_PreferenceTypeThermo = "S"
EndSelect

If l_MemoThermocouple <> G_PreferenceTypeThermo Then
'Appel de la config des loreme
G_configurationLoremeOk = False

F_Loreme.Show1

If G_configurationLoremeOk Then
'Si retout LOREME Ok
SelectCase G_PreferenceTypeThermo
Case"S"
G_TemperatureGradient.EchelleH = 1550
G_TemperatureGradient.EchelleB = 0
G_TemperatureEchant.EchelleH = 1550
G_TemperatureEchant.EchelleB = 0
G_TemperatureSuscepteur.EchelleH = 1550
G_TemperatureSuscepteur.EchelleB = 0
Case"K"
G_TemperatureGradient.EchelleH = 1200
G_TemperatureGradient.EchelleB = -200
G_TemperatureEchant.EchelleH = 1200
G_TemperatureEchant.EchelleB = -200
G_TemperatureSuscepteur.EchelleH = 1200
G_TemperatureSuscepteur.EchelleB = -200
Case"B"
G_TemperatureGradient.EchelleH = 1600
G_TemperatureGradient.EchelleB = 200
G_TemperatureEchant.EchelleH = 1600
G_TemperatureEchant.EchelleB = 200
G_TemperatureSuscepteur.EchelleH = 1600
G_TemperatureSuscepteur.EchelleB = 200
EndSelect
Else
'Si retour LOREME pas Ok
G_PreferenceTypeThermo = l_MemoThermocouple
EndIf

EndIf

G_DeplacementFour.EchelleB = TE_DeplaceMinFour.Text
G_DeplacementFour.EchelleH = TE_DeplaceMaxFour.Text

G_DeplacementEchant.EchelleB = TE_DeplaceMinEchant.Text
G_DeplacementEchant.EchelleH = DeplaceMaxEchant.Text

Call Ecriture_Fichier_Init
Pr_StateConfRes = 1

Unload Me
EndSub
 


Est ce que quelqu'un a deja eu ce soucis, et comment l'avez vous résolu.

Si vous n'avez jamais eu ce problème, avez vous une idée d'ou cela peut provenir.


Merci d'avance.

Cordialement.

10 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut DataFailure
J'ai bien reçu ton projet.
J'étais en train d'écrire une baffouille pour t'expliquer comment il fallait faire pour fermer proprement un projet et je suis tombé sur l'erreur :

Dans MDIForm_QueryUnload, tu lances Quitter_Click
Or, Quitter_Click provoque l'apparition de QueryUnload
Tout cela se mord la queue, d'où ton problème de figeage.

Pour fermer un projet, il ne faut jamais utiliser End tout seul.
Oui, ça ferme le projet, mais ce n'est pas propre et il peut arriver des problèmes.
Un "Unload Me" dans la forme principale suffit :
Le "Unload Me" provoque un "QueryUnload" puis, si Cancel n'a pas été mis à True, "Form_Unload" se déclenchera.
Dans le "Form_Unload" :
- Tu sauvegarde tes paramètres (...)
- Tu demandes à toutes tes autres formes (ou Child pour les MDI) de se refermer
   For r = (Forms.Count - 1) To 1 Step -1
      Unload Forms(r)
   Next r
Avec ça, on demande le déchargement de toutes les formes (standards ou Child) sauf la principale
Une fois que la boucle est terminée, un petit DoEvents histoire de dire puis le Unload Me final qui fera quitter le projet

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut
Quand tu dis "il plante", est-ce qu'il tourne en rond et fige ou bien est-ce qu'il génère un évènement géré par Windows demandant à debugguer ou à envoyer à Microsoft ?

Je pense qu'il doit figer, tourner en rond comme tu dis.
Vérifie, dans tout ton programme et pas seulement dans le code de ta MdiForm, si tu as des boucles For-Next ou Do-Loop dans lesquels il pourrait resté coincé.
Dans un premier temps, ajoute un DoEvents dans toutes tes boucles.
Ca ne changera pas qu'il tourne en rond, mais tu pourras ainsi garder la maitrise de l'IDE de developpement et interrompre le programme pour savoir où il est au moment du tourne en rond.

Ensuite, vérifie ce qu'il y a dans les Form_QueryUnload et Form_Unload.
S'il y a du code, regarde le de plus près et vérifie qu'il ne fait pas d'appel sans cesse ...

Dernière chose : Puisque tu fais des accès à une carte d'acquisition, tu utilises peut-être une DLL ou un composant fourni par le constructeur.
Avant de faire le UnLoad, vérifie que tu fermes correctement les communications, les fichiers, etc ...
Certains composants peuvent utiliser du Hook et l'arrêt d'un programme sans fermeture propre, l'IDE VB6 n'aime pas du tout (plantade assurée).

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
6
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
4 mars 2008

Merci pour la réponse,

Effectivement apres appelle à Unload Me, l'environnement de dev se fige.
Je n'ai aucun code dans Form_QueryUnload et Form_Unload.

Je ne pense pas egalement qu'il reste coincé dans une boucle, ma vue de "Configuration" (F_Loreme) se ferme bien sans soucis.

Effectivement j'utilise une DLL fourni par le constructeur de ma carte d'acquisition (que je n'utilise pas dans cette partie du code), si c'etait un problème de fermeture de fichier ou de comm, j'aurais deja eu des soucis non? (mon soft est quasi terminé, c'est le dernier bug recurent que j'ai trouvé avant mise en prod).
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Bonjour,

et le code (qu'on ne voit pas) de la procédure Ecriture_Fichier_Init ?

Il est écrit comment ?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Re
Est-ce que, dans ton projet, tu utilises des bouts de code (UserControl ou Class) que tu n'as pas fait toi même; le genre d'ajout qu'on fait pour avoir des boutons plus jolis ou un truc comme ça ?
Parce que peut-être que ce sont ces ajouts qui créent le problème (à cause des fameux Hook)

En dernier recourt, si tu le veux, met tout ton projet dans un Zip et stocke-le quelque part sur internet,puis, envoie moi un message privé (en cliquant sur mon pseudo) pour me donner l'adresse du fichier zip.
Je l'ouvrirai et regarderai si je vois des choses bizarres.
Pendant que tu y es, glisse moi un kedjenou dans le zip !

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
6
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
4 mars 2008

Avant tout merci de l'interet que vous porter à mon sujet.

Concernant le code de la procédure Ecriture_Fichier_Init, je ne pose aucune question la dessus, cette procédure étant utiliser dans des dizaine d'appli VB dans ma boite et l'ayant moi même utiliser un certain nombre de fois.
En fait elle écrit tout simplement dans un fichier *.ini des lignes genre "MaVariable1 = G_MaVariable1" ou G_MaVariable1 est une chaine de caractére definit en Global.

Autrement je n'utilise pas d'UserControl ou de choses dans le genre, ils sont pas trop fan de ca dans l'industrie :)

Je t'enverrais un Zip des lundi si je ne trouve pas une idée de génie d'ici là :)

Mmmh...par contre qu'est ce qu'un kedjenou? ==> Apres recherche Google ce serait un poulet, va falloir bien le compresser le zip ;)

Encore merci et bon week end.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
= spécialité de côte d'ivoire : peau de banane farcie
Mais excuse moi, je me suis trompé de réponse/personne (une autre question sur le forum venant d'un ivoirien)
Messages postés
6
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
4 mars 2008

Bonjour,

J'espere que tu as passé un bon week end, comme convenu je t'ai envoyé un MP.

Merci pour ton aide :)
Messages postés
6
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
4 mars 2008

Merci, je verifie ca demain afin de valider la réponse.

Merci beaucoup
Messages postés
6
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
4 mars 2008

Bon bah voila, testé ce matin, tout à l'air OK, il faut esperer que se soit pareil chez le client ;)

Encore merci pour ton aide et tes conseils precieux, j'arrete de t'embeter jusque la prochaine fois ;)

Cordialement.

DataFailure