DataFailure
Messages postés6Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 4 mars 2008
-
29 févr. 2008 à 15:28
DataFailure
Messages postés6Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 4 mars 2008
-
4 mars 2008 à 09:30
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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 3 mars 2008 à 20:08
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)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 29 févr. 2008 à 16:57
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)
DataFailure
Messages postés6Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 4 mars 2008 29 févr. 2008 à 17:07
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).
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 29 févr. 2008 à 19:01
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)
DataFailure
Messages postés6Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 4 mars 2008 29 févr. 2008 à 19:42
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 ;)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 29 févr. 2008 à 20:27
= 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)