IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Instancier plusieurs objets dans une boucle


Sujet :

WinDev

  1. #41
    Membre actif

    Homme Profil pro
    Sans
    Inscrit en
    Mars 2018
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Mars 2018
    Messages : 153
    Points : 295
    Points
    295
    Billets dans le blog
    1
    Par défaut
    Salut,

    A quels endroits dans ton projet utilises-tu des objets de type ClassePLC ?

    Peut-être que tu cherches au mauvais endroit et que le(s) instance(s) restante(s) ne concerne pas cette boucle.

    Quoiqu'il en soit, je te conseille d'utiliser le mot clef dynamic systématiquement, à la déclaration d'un objet, à un passage de paramètre, à l'instanciation, ...

  2. #42
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    J'utilise ça dans une procédure, pour arrêter des thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    clobj est ClassePLC dynamique
    POUR TOUT ELEMENT clobj DE gtabMaListeObj	
    	clobj:Status_Change(Faux)
     
    	TANTQUE ThreadEtat("Read_"+clobj:m_sLibelle) = threadEnCours  Multitâche(-10)
    	TANTQUE ThreadEtat("Write_"+clobj:m_sLibelle) = threadEnCours Multitâche(-10)
    FIN
    et ça dans le code de fermeture de la fenêtre principale

    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)

  3. #43
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 46
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    Je viens de lire tout le thread rapidement.

    Au sujet des objet non libérés : si vous utiliser 'tableauajoute', vous allez avoir une copie d'objet.
    Il faut utiliser 'tableauAjouteRéférence' pour intégrer l'instance, dans le tableau.

    Sinon, vous pouvez libérer l'objet, apres avoir fait le 'tableauAjoute', mais c'est moins propre et moins clair.

    NB : Petit conseil, n'utilisez jamais '=' entre 2 objets, mais toujours '<-' ou '<=', sinon, c'est la débâcle.

  4. #44
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    merci, je viens de tester le tableauAjouteReference() :

    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)
    	TableauAjouteRéférence(gtabMaListeObj,gpclMonObj)	
    FIN
    Toujours le même phénomène lors de la fermeture de l'application...

  5. #45
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    avec les essais, je me rends compte que le problème apparait dès que j'utilise cette instruction, qui appele la méthode Status_Change() :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nMonIndice = TableauCherche(gtabMaListeObj,tcLinéairePremier,"m_sAdresseIP",sIpClient)
     
    gtabMaListeObj[nMonIndice]:Status_Change(Vrai,sMonCanal)
    Voici la méthode en question :

    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
    22
    23
    24
    25
    26
    27
    PROCÉDURE Status_Change(bMonStatus est un boolean = Faux, sMonCanal est une chaîne = "")
     
    SELON bMonStatus
     
    	CAS Vrai :
    		Add_Debug(dbgInfo(dbgTraitement), dbgInfo(dbgLigne),Info_Application,:m_sLibelle + " : Connexion acceptée" , "")
     
    		:m_sMonCanal = sMonCanal
    		:m_bMonStatus = bMonStatus
    		:IHM_Refresh(RVB(0,255,0))
     
    		ThreadExécute("Write_"+:m_sLibelle,threadNormal,:Write)
    		ThreadExécute("Read_"+:m_sLibelle,threadNormal,:Read)
     
    	CAS Faux :		
    		:m_bMonStatus = bMonStatus		
    		:IHM_Refresh(RVB(255,0,0))	
     
    		ThreadPause(500 ms)
     
    		SI :m_sMonCanal <> "" ALORS
    			SI SocketExiste(:m_sMonCanal) ALORS SocketFerme(:m_sMonCanal)
    			:m_sMonCanal = ""
    		FIN
     
    		TableauSupprimeTout(:m_tabListeDataToSend)
    FIN

  6. #46
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 46
    Points : 59
    Points
    59
    Par défaut
    Que vous dit le 'analyseurDebut()' et 'analyseurFin()'?

  7. #47
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    ok, je devrais trouver quoi ?

  8. #48
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Citation Envoyé par jjacques68 Voir le message
    avec les essais, je me rends compte que le problème apparait dès que j'utilise cette instruction, qui appele la méthode Status_Change() :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nMonIndice = TableauCherche(gtabMaListeObj,tcLinéairePremier,"m_sAdresseIP",sIpClient)
     
    gtabMaListeObj[nMonIndice]:Status_Change(Vrai,sMonCanal)
    Voici la méthode en question :

    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
    22
    23
    24
    25
    26
    27
    PROCÉDURE Status_Change(bMonStatus est un boolean = Faux, sMonCanal est une chaîne = "")
     
    SELON bMonStatus
     
    	CAS Vrai :
    		Add_Debug(dbgInfo(dbgTraitement), dbgInfo(dbgLigne),Info_Application,:m_sLibelle + " : Connexion acceptée" , "")
     
    		:m_sMonCanal = sMonCanal
    		:m_bMonStatus = bMonStatus
    		:IHM_Refresh(RVB(0,255,0))
     
    		ThreadExécute("Write_"+:m_sLibelle,threadNormal,:Write)
    		ThreadExécute("Read_"+:m_sLibelle,threadNormal,:Read)
     
    	CAS Faux :		
    		:m_bMonStatus = bMonStatus		
    		:IHM_Refresh(RVB(255,0,0))	
     
    		ThreadPause(500 ms)
     
    		SI :m_sMonCanal <> "" ALORS
    			SI SocketExiste(:m_sMonCanal) ALORS SocketFerme(:m_sMonCanal)
    			:m_sMonCanal = ""
    		FIN
     
    		TableauSupprimeTout(:m_tabListeDataToSend)
    FIN
    Montre le code de tes 2 procédures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		ThreadExécute("Write_"+:m_sLibelle,threadNormal,:Write)
    		ThreadExécute("Read_"+:m_sLibelle,threadNormal,:Read)
    je suis convaincu que tu utilises des objets dedans avec une mauvaise prise de référence

  9. #49
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    @mous97, désolé, je n'ai pas vu ta dernière réponse, j'ai pas eu la notification par mail, ou j'ai pas fait attention...



    alors je pense avoir trouvé d'où vient le problème.
    Enfin je crois, car depuis que j'ai modifié ça j'ai plus le soucis...
    Mais alors c'est nul....

    dans mes méthodes, il y a donc 2 thread qui tournent en boucle.
    Le "Read" et le "Write".

    Dans ces thread, je fais appel à d'autres méthodes qui modifient l'IHM (affichage des trames reçues sur la socket, voyant de connexion, bref...)
    Ces méthodes modifient donc mon IHM.
    Elles sont donc appelées depuis les thread.

    J'ai donc tout logiquement coché la case "Exécuter dans le thread principal" des propriétés de procédure automatique de ces méthodes (comme j'ai toujours fait en programmation procédural)
    sinon j'ai un warning comme quoi je ne dois pas modifier l'IHM depuis un thread secondaire blablabla.

    du coup lorsque j'appel ces méthodes, j'ai le symbole suivant qui s'affiche :
    Nom : Sans titre.png
Affichages : 145
Taille : 2,4 Ko

    J'ai remplacé cette manière d'appeler par la bonne vieille manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExécuteThreadPrincipal(:Frame_Display,sMaTrame, "Rx")
    J'ai fait ça pour toutes les méthodes qui accèdent à l'IHM et j'ai plus ce warning lors de la fermeture de l'application...

    donc conclusion :

    en POO, ne pas utiliser les procédures automatiques, c'est le bordel...

    ça me parait insensé cette conclusion...

Discussions similaires

  1. Instanciation d'objets dans une boucle
    Par Mister Nono dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/12/2017, 16h46
  2. Instancier plusieurs objets avec une boucle for
    Par bromy dans le forum Android
    Réponses: 4
    Dernier message: 28/03/2017, 23h13
  3. plusieurs objets dans une fenêtre
    Par KalKul dans le forum OpenGL
    Réponses: 5
    Dernier message: 23/03/2008, 15h27
  4. declarer plusieurs JcheckBox dans une boucle
    Par 01211983 dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 21/02/2008, 02h47
  5. [FLASH MX] Créer un objet dans une boucle
    Par alexfrere dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 30/04/2006, 02h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo