oui tout à fait, j'ai bien l'impression que c''est lui qui me fait ramer le thread...
Mais je vois pas comment faire autrement...
oui tout à fait, j'ai bien l'impression que c''est lui qui me fait ramer le thread...
Mais je vois pas comment faire autrement...
Je fais completement fausse route.
Ce n'est pas la fonction socketEcrit() avec le tableau type "queue liste" qui pose problème.
Mais la timeout définit dans la fonction socketLit().
J'ai bien l'impression que celle-ci bloque la socket tant qu'elle ne reçoit rien !!
Je me suis permis d'ouvrir un nouveau post à ce sujet...
je reprends le sujet de base, l'instanciation d'objet dans la boucle :
j'utilise ceci dans le code d'init du projet :
est ce la bonne méthode ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 gtabMaListeObj est un tableau de MaClasse POUR TOUT MonFic gpclMonObj est MaClasse (MonFic.Rub1, MonFic.Rub2) TableauAjoute(gtabMaListeObj,gpclMonObj) FIN libérer gpclMonObj
Si je met un trace dans la méthode constructeur, j'ai l'impression qu'il m'instancie exactement le double du nombre d'obet qu'il devrait.
Et j'ai cet avertissement quand je quitte lappliaction :
J'ai l'impression de louper qqch, mais je sais pas quoi ??Des instances de la classe 'MaClasse' n'ont pas été libérées (1).
Ceci peut être dû à des références circulaires entre les instances.
Il est possible de briser le cycle grâce à une référence faible ou de forcer la libération d'une instance grâce à l'instruction 'libérer'.
Si vous avez une idée ?
Bonjour,
Un FichierVersTableau devrait régler le problème
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 gtabListeFic est tableau de MClasseFic //La classe doit être mappée ou respecter les normes précisée dans la doc FichierVersTableau(gtabListeFic,MonFic)
Il y a peut-être plus simple, mais ça tourne.
Quand tout a échoué utilisez l'option RTFM
je vais essayer ça, merci.
en attendant, je pense avoir résolu le problème d'instanciation en ajoutant "dynamique" dans la déclaration du tableau.
ça reste flou pour moi...
Mais ça ne m'enlève pas le warning lorsque je quitte l'application...
As tu libéré ton tableau ?
Normalement, la libération d'une classe se fait automatiquement lorsqu'on via le destructeur, mais comme tu as des instances qui sont toujours utilisées, le destructeur n'est pas appelé.
Il y a peut-être plus simple, mais ça tourne.
Quand tout a échoué utilisez l'option RTFM
j'ai essayé :
tableausupprimetout()
parcourir chaque objet dans une boucle et faire un libérer objet
libérer ce tableau (là j'ai une erreur)
j'ai bien fait attention, à stopper proprement les thread (certaines méthodes des objets) (et je confirme leur bon arrêt)
mais rien de tout ça ne fonctionne.
ce qui est étrange , c'est que si je ne démarre pas les thread, j'ai pas cette erreur lors de la fermeture de l'application.
Je l'ai que si un thread a été démarrer.
Mais avant de quitter, j'ai bien la preuve que le(s) thread sont bien arrêtés. ça c'est sûr...
???
A mon avis tu dois être dans l'un des cas de figure décrit ici
Il y a peut-être plus simple, mais ça tourne.
Quand tout a échoué utilisez l'option RTFM
hmmm, j'ai bien lu, je ne pense pas être dans ce cas là...
alors je confirme que les thead n'y sont pour rien.
L'utilisation de FichierVersTableau() ne résoud pas ce problème.
En fait j'ai l'impression que c'est dès que j'utilise les objects que ça bloque à la fermeture.
c'est dingue parce que je bien la procédure constructeur se dérouler (pour mes 3 objets) et également la procédure destructeur !!!
Je n'arrive pas à comprendre d'où viens ce message !
"
Des instances de la classe 'MaClasse' n'ont pas été libérées (1).
Ceci peut être dû à des références circulaires entre les instances.
Il est possible de briser le cycle grâce à une référence faible ou de forcer la libération d'une instance grâce à l'instruction 'libérer'.
"
En général quand tu as ce genre d'avertissement c'est du a des références d'objets sur tes membres de classes, montre moi la structure de tes classes et je te résous ce soucis
Quand tu parles de la structure, c'est quand même pas tout avec les méthodes complètes si ?
Ton schéma UML suffira je pense
Il y a peut-être plus simple, mais ça tourne.
Quand tout a échoué utilisez l'option RTFM
bon et bien voilà :
désolé pour l'indentation merdique lié au copié/collé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 ClassePLC est une Classe m_sLibelle est une chaîne = "" m_sAdresseIP est une chaîne = "" m_sMonCanal est une chaîne = "" m_bMonStatus est un boolean = Faux m_nIHM_Couleur est un entier = 0 m_tabListeDataToSend est un tableau de chaînes FIN PROCÉDURE Constructeur(sMonIP est une chaîne="", sMonLibelle est une chaîne ="") :m_sLibelle = sMonLibelle :m_sAdresseIP = sMonIP :m_nIHM_Couleur = RVB(255, 0, 0) //Trace("constructeur", sMonLibelle) PROCÉDURE Destructeur() //trace("destructeur", :m_sLibelle)
J'ai juste besoin des déclarations de tes classe pas les méthodes, c'est la seule classe que tu utilises ? Montre le code ou tu déclares et utilises ton tableau
oui c'est la seule classe.
Voici le code qui instancie les objets (placé dans le code d'init du projet)
(PLC est le fichier .FIC qui contient les données...)
Dans le code de fermeture de la fenêtre principale je libère les objet avec ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 gtabMaListeObj est un tableau de ClassePLC dynamique POUR TOUT PLC gpclMonObj est ClassePLC (PLC.AdresseIP, PLC.Libelle) TableauAjoute(gtabMaListeObj,gpclMonObj) FIN
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 //libère les objets POUR i = 1 À gtabMaListeObj..Occurrence libérer gtabMaListeObj[i] TableauSupprimeTout(gtabMaListeObj)
Ne déclare pas ton tableau en dynamique
Désolé, mais déjà essayé, ça ne me règle pas le problème.
En plus, sans "dynamique", c'est ce que je disais plus haut, j'ai l'impression qu'il m'instancie le double d'objets qu'il devrait.
Je me rends compte quand j'active ma trace dans le constructeur.
J'ai pour chaque objet 2 traces...
Bon ça n'empêche toujours pas le bon fonctionnement du programme.
Mais toujours ce bug à la fermeture.
ça m'énerveeeeeee !
Ici, ce n'est pas le tableau qui est dynamique mais les objets de type ClassePLC qu'il devrait contenir.
Cependant, cette déclaration ne correspond pas au code inclus dans ta boucle. Le code suivant ne génère pas des objets dynamique :
Tu devrais plutôt l'écrire de cette manière et voir comment se comporte la libération des objets :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 gpclMonObj est ClassePLC (PLC.AdresseIP, PLC.Libelle)
hth,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 gpclMonObj est ClassePLC dynamic <- new ClassePLC(PLC.AdresseIP, PLC.Libelle)
Padbrain
Je viens d'essayer :
malheureusement, ça ne change rien...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 gtabMaListeObj est un tableau de ClassePLC dynamique POUR TOUT PLC gpclMonObj est ClassePLC dynamique <- new ClassePLC(PLC.AdresseIP, PLC.Libelle) TableauAjoute(gtabMaListeObj,gpclMonObj) FIN
J'ai également essayé avec ou sans les "dynamique".
Par contre petite remarque, je sais pas si ça a de l'importance ou pas, mais j'ai une Zone répétée dans l'IHM, qui a comme source ce tableau d'objets...
avec attributs et champs en liaisons sur des membres de l'objet...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager