Threading

Threading - Python - Programmation

Marsh Posté le 16-03-2013 à 18:26:36    

Bonjour tout le monde!
 
J'ai quelques problèmes concernant les Threads, surement du au fait que je n'ai toujours pas compris comment animer de nombreux objets simultanément dans un canevas à l'aide des Threads...
 
L'objectif du programme est de tenter de créer une colonie de fourmis (pour les connaisseurs, ant colony optimisation), celles-ci doivent partir chercher de la nourriture, et une fois trouvée, doivent la rapporter au nid en laissant derrière elles des phéromones, de manière à ce que les autres suivent le chemin (ou plus précisément l'odeur des phéromones)
 
Je vous passe le code de la création des fourmis étape par étape, tout en sautant la partie lourde du canvas et des créations de moultes obstacles, et si quelqu'un veut bien m'expliquer comment réussir les Threads (car ici pour faire bouger toutes les fourmis, je les prend une par une moi même), je lui en serait infiniment reconnaissant  :love:  
 
 
PS: Je tiens à m'excuser pour ma manière de coder, je débute un peu, surtout en Python =/
     Et pour ceux qui en ont besoin, je peux leur fournir le reste du code, même si l'architecture de celui-ci est à vomir  :sweat:  
 
 
 
 
#### Les fourmis sont créées sur la création du nid ici ####
 
 
 
def ajoutnid(nbfourmi, x, y) :  
 global can1, ID, fourmi
 nid = can1.create_oval(x-15,y-15,x+15,y+15,fill='brown', tag="NID" )
 print(nid)
 can1.tag_raise(nid)
 acc = nbfourmi
 while(acc>0) :
  ID = acc + nid
  fourmi = creerfourmi(can1, x, y)
  can1.fourmi=fourmi
  acc = acc - 1
 
 
 
 
 
#### Et ici la partie thread des fourmis ####
 
 
 
 
class creerfourmi(threading.Thread) :
 
 directions = [
  ('N', (0, -5)),
  ('E', (5, 0)),
  ('S', (0, 5)),
  ('W', (-5, 0)),
  ('NE', (5, -5)),
  ('NO', (-5, -5)),
  ('SW', (-5, 5)),
  ('SE', (5, 5))
  ]
   
   
 def __init__(self, can1, x, y) : # virer l'id via des threads
  self.posX, self.posY = x, y  #coordonnées initiales OK, déplacement à revoir, thread mal engagé?
  self.portnourriture = 0
  self.endurance=50
  self.vitesse=vitesse
  self.couleur=couleur
  self._stopevent=threading.Event( )
  r1 = random.uniform(-20,20)
  r2 = random.uniform(-20,20)
  self.ID=can1.create_oval(x+r1-3,y+r2+1,x+r1+3,y+r2-1,fill=couleur, tag="fourmi" )
  threading.Thread.__init__(self, target=self.move)
 
 
 def move(self) : #à améliorer, de manière a utiliser le thread#
  #=== déplacement de la fourmi ===#
  while not self._stopevent.isSet():
   self._stopevent.wait(0.05)
   indice = self.ID
   while(indice>1) :
    if(self.endurance>0) :
     ran = random.choice(self.directions)[1]
     r1 = tuple(ran)
     can1.move(indice, r1[0], r1[1])
     can1.update()
     indice=indice-1
    else :
     can1.move(indice, self.posX, self.posY)
     self.endurance = 50
   self.endurance = self.endurance-1
 
 
 
 
 def stop(self) :
  self._stopevent.set( )
   
   

Reply

Marsh Posté le 16-03-2013 à 18:26:36   

Reply

Marsh Posté le 17-03-2013 à 14:28:43    

Pour ceux qui ont ou sont en train de lire/essayer de résoudre le problème, je viens de comprendre qu'il fallait faire start sur chaque fourmi, tout simplement, dans tout les cas merci à eux :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed