MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    ConcurrentModificationException

    Planifier Épinglé Verrouillé Déplacé Sans suite
    1.10.x
    15 Messages 5 Publieurs 3.6k Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • AmaA Hors-ligne
      Ama
      dernière édition par

      Même problème qu’une array 😕

      Si je t'ai filé un coup de main n'oublie pas le + / -
      Par contre évite les demandes d'aides en MP, tu sera sympa'

      La JavaDoc c'est comme le PQ, ça sert à ce démerder tous seul. -Victor Hugo- 2017

      Une superbe API pour animer vos super modèles CraftStudio dans Minecraft !

      1 réponse Dernière réponse Répondre Citer 0
      • RedRelayR Hors-ligne
        RedRelay Moddeurs confirmés
        dernière édition par

        Surtout pas ! Vector est une classe obsolète qui n’est la que pour répondre aux contraintes de la rétrocompatibilité !

        Tu utilise un iterator implicite dans tes boucles, vérifie que tu ne modifie pas ta liste lorsqu’elle est parcourue par un iterator de ce type.
        ArrayList n’est pas thread-safe. Vu les opérations que tu réalises sur tes listes, une ArrayList semble être une aberration.
        L’ArrayList est efficace pour les accès direct (via des indices) et est très gourmande en ressource lorsqu’il s’agit de faire des ajouts/suppressions.
        Vu que tu accès aux éléments via un itérator, utilise plutôt une LinkedList.
        Si tu dois faire des modifications, utilise Iterator.remove().

        –------------------------------------------------------------------------------------
        Si tu trouves mon intervention pertinente, n'hésite pas a m…

        1 réponse Dernière réponse Répondre Citer 0
        • AmaA Hors-ligne
          Ama
          dernière édition par

          Donc même avec la linkedList il y a la même erreur classe actuelle:

          :::

          package lib.craftstudio.common.animation;
          
          import java.util.LinkedList;
          
          import lib.craftstudio.common.IEntityAnimated;
          import net.minecraft.entity.Entity;
          import net.minecraftforge.common.MinecraftForge;
          import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
          import net.minecraftforge.fml.common.gameevent.TickEvent;
          import net.minecraftforge.fml.common.gameevent.TickEvent.Phase;
          import net.minecraftforge.fml.relauncher.Side;
          import net.minecraftforge.fml.relauncher.SideOnly;
          
          public class AnimTickHandler
          {
             private LinkedList <ientityanimated>activeEntities    = new LinkedList<ientityanimated>();
             private LinkedList <ientityanimated>removableEntities = new LinkedList<ientityanimated>();
          
             public AnimTickHandler()
             {
                 MinecraftForge.EVENT_BUS.register(this);
             }
          
             public void addEntity(IEntityAnimated entity)
             {
                 this.activeEntities.add(entity);
             }
          
             // Called when the client ticks.
             @SubscribeEvent
             @SideOnly(Side.CLIENT)
             public void onClientTick(TickEvent.ClientTickEvent event)
             {
                 if (!this.activeEntities.isEmpty())
                     if (event.phase == Phase.START)
                     {
                         System.out.println("Size List : " + this.activeEntities.size());
                         for (IEntityAnimated entity : this.activeEntities)
                         {
                             System.out.println("Size List 2 : " + this.activeEntities.size());
                             System.out.println("SEMENCE: " + entity);
          
                             entity.getAnimationHandler().animationsUpdate();
          
                             if (((Entity) entity).isDead)
                                 this.removableEntities.add(entity);
                         }
                         System.out.println("Size List 3 : " + this.activeEntities.size());
                         for (IEntityAnimated entity : this.removableEntities)
                             this.activeEntities.remove(entity);
                         this.removableEntities.clear();
                     }
             }
          
             // Called when the server ticks. Usually 20 ticks a second.
             @SubscribeEvent
             @SideOnly(Side.SERVER)
             public void onServerTick(TickEvent.ServerTickEvent event)
             {
                 if (!this.activeEntities.isEmpty())
                     if (event.phase == Phase.START)
                     {
                         System.out.println("Size List : " + this.activeEntities.size());
                         for (IEntityAnimated entity : this.activeEntities)
                         {
                             System.out.println("Size List 2 : " + this.activeEntities.size());
                             System.out.println("SEMENCE: " + entity);
          
                             entity.getAnimationHandler().animationsUpdate();
          
                             if (((Entity) entity).isDead)
                                 this.removableEntities.add(entity);
                         }
                         System.out.println("Size List 3 : " + this.activeEntities.size());
                         for (IEntityAnimated entity : this.removableEntities)
                             this.activeEntities.remove(entity);
                         this.removableEntities.clear();
                     }
             }
          
             // Called when a new frame is displayed (See fps)
             @SubscribeEvent
             @SideOnly(Side.CLIENT)
             public void onRenderTick(TickEvent.RenderTickEvent event)
             {}
          
             // Called when the world ticks
             @SubscribeEvent
             public void onWorldTick(TickEvent.WorldTickEvent event)
             {}
          }
          

          :::

          Mais le problème à l’air de ce résoudre avec une CopyOnWriteArrayList mais créant un autre problème, une boucle infinie au même endroit</ientityanimated></ientityanimated></ientityanimated></ientityanimated>

          Si je t'ai filé un coup de main n'oublie pas le + / -
          Par contre évite les demandes d'aides en MP, tu sera sympa'

          La JavaDoc c'est comme le PQ, ça sert à ce démerder tous seul. -Victor Hugo- 2017

          Une superbe API pour animer vos super modèles CraftStudio dans Minecraft !

          1 réponse Dernière réponse Répondre Citer 0
          • SCAREXS Hors-ligne
            SCAREX
            dernière édition par

            Si ça marche pas, soit faut faire un bloc synchronized, soit créer une copie de la liste

            Site web contenant mes scripts : http://SCAREXgaming.github.io

            Pas de demandes de support par MP ni par skype SVP.
            Je n'accepte sur skype que l…

            1 réponse Dernière réponse Répondre Citer 0
            • RedRelayR Hors-ligne
              RedRelay Moddeurs confirmés
              dernière édition par

              Tu peux nous dire a quoi servent tes listes ?

              –------------------------------------------------------------------------------------
              Si tu trouves mon intervention pertinente, n'hésite pas a m…

              1 réponse Dernière réponse Répondre Citer 0
              • AmaA Hors-ligne
                Ama
                dernière édition par

                Mes liste sevent à enregistrer/supprimer les entités qui peuvent êtres animée ou non grâce à l’interface EntityAnimated

                Cette erreur de “concurrence” arrive une fois le patch de la classe du Joueur autrement je n’ai pas cette erreur (mais le joueur n’est pas animé snif)

                Si je t'ai filé un coup de main n'oublie pas le + / -
                Par contre évite les demandes d'aides en MP, tu sera sympa'

                La JavaDoc c'est comme le PQ, ça sert à ce démerder tous seul. -Victor Hugo- 2017

                Une superbe API pour animer vos super modèles CraftStudio dans Minecraft !

                1 réponse Dernière réponse Répondre Citer 0
                • RedRelayR Hors-ligne
                  RedRelay Moddeurs confirmés
                  dernière édition par

                  Pourquoi tu te sers de 2 listes alors ?

                  –------------------------------------------------------------------------------------
                  Si tu trouves mon intervention pertinente, n'hésite pas a m…

                  1 réponse Dernière réponse Répondre Citer 0
                  • AmaA Hors-ligne
                    Ama
                    dernière édition par

                    Effectivement, j’ai pas approfondi le code, qui n’est pas de moi à la base (jettez moi des cailloux) je rectifie le code donc

                    Si je t'ai filé un coup de main n'oublie pas le + / -
                    Par contre évite les demandes d'aides en MP, tu sera sympa'

                    La JavaDoc c'est comme le PQ, ça sert à ce démerder tous seul. -Victor Hugo- 2017

                    Une superbe API pour animer vos super modèles CraftStudio dans Minecraft !

                    1 réponse Dernière réponse Répondre Citer 0
                    • J Hors-ligne
                      Jodge
                      dernière édition par

                      Je pense que l’erreur vient bêtement de ta fonction addEntity.
                      Le truc c’est que ta List est déjà utilisé la majeur partie du temps par l’événement TickEvent.

                      Je ne citerai qu’un bout du tuto sur la synchronisation de developpez.com :

                      Évitez les anciennes Collections datant de Java 1.0 (Vector, Hashtable…) qui sont par défaut synchronisées, mais utilisez les nouvelles datant de Java 1.2 (ArrayList, HashMap…) qui ne sont pas synchronisées (meilleures performances). Pour récupérer une vue synchronisée d’une Collection, il suffit de faire Collections.synchronizedCollection(Collection).

                      Si la solution de copie synchro ne fonctionne pas, tu peux toujours te tourner vers les mutex.

                      1 réponse Dernière réponse Répondre Citer 0
                      • RedRelayR Hors-ligne
                        RedRelay Moddeurs confirmés
                        dernière édition par

                        Le problème existera toujours avec une vue synchronisée car les iterators ne sont pas thread-safe.
                        Il faut soit-même faire un iterator thread-safe ou effectuer une synchronisation global la portion de code qui utilise l’iterator.

                        –------------------------------------------------------------------------------------
                        Si tu trouves mon intervention pertinente, n'hésite pas a m…

                        1 réponse Dernière réponse Répondre Citer 0
                        • AymericRedA Hors-ligne
                          AymericRed
                          dernière édition par

                          Ou juste copier la liste avant l’itération, et créer une liste d’éléments à supprimer après l’itération.

                          Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                          AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                          Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                          Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                          1 réponse Dernière réponse Répondre Citer 0
                          • J Hors-ligne
                            Jodge
                            dernière édition par

                            Cloner des listes n’est pas forcément une bonne idée, pour peu qu’elle soit grosse… Surtout qu’on parle ici d’une fonction appeler très régulièrement…

                            Le mieux niveau performance restera sans doute le mutex…

                            1 réponse Dernière réponse Répondre Citer 0
                            • RedRelayR Hors-ligne
                              RedRelay Moddeurs confirmés
                              dernière édition par

                              @‘AymericRed’:

                              Ou juste copier la liste avant l’itération, et créer une liste d’éléments à supprimer après l’itération.

                              Ce qui donnera des problèmes de synchronisations de données et des problèmes de performances

                              –------------------------------------------------------------------------------------
                              Si tu trouves mon intervention pertinente, n'hésite pas a m…

                              1 réponse Dernière réponse Répondre Citer 0
                              • 1 / 1
                              • Premier message
                                Dernier message
                              Design by Woryk
                              ContactMentions Légales

                              MINECRAFT FORGE FRANCE © 2024

                              Powered by NodeBB