Partage
  • Partager sur Facebook
  • Partager sur Twitter

Timer fait crasher

Sujet résolu
    20 mai 2011 à 21:25:55

    Bonjour les 0

    Le topo : j'ai créé un bot pour un jeu, les joueurs le contrôlent en lui parlant directement. Leurs commandes s'inscrivent dans le fichier de log du jeu parmis pleins d'autres infos inutiles.
    La fonction récupère la ligne en question et d'autres fonctions traitent ça.

    Le but : Lire ce log ligne par ligne toutes les x secondes pour voir si une commande est arrivée et si oui, envoi à la fonction de traitement. Après plusieurs heures de jeu, le fichier ne dépasse pas les 800ko, rien de méchant dans le traitement normalement.

    Le code :
    from threading import *
    def checknewcmd():
    	#Si b n'existe pas encore on lui donne la valeur 0
    	try:
    		b
    	except NameError:
    		b=0
    		global b
    	fichier = open('log.txt',"r")
    	t = Timer(3.0, checknewcmd)
    	t.start()
    	a = 0 #on remet toujours a à zéro puisque la lecture reprend tjs depuis le début du fichier
    	#print 'Infos a=' +str(a)+' and b=' +str(b)
    	for ligne in fichier:
    		a = a+1 #numéro de la ligne dans le fichier
    		if 'Chat:' in ligne  and a > b and 'nomdubot' not in ligne:
    			checkcommand(ligne)
    			b=a
    	fichier.close()
    checknewcmd()
    


    Il fonctionne parfaitement, aucune erreur rien ... sauf qu'après un temps variable (jamais plus d'une heure), paf, crash avec une erreur que j'ai plus en tête mais qui indique un problème sur cette fonction à cause des threads qui sont lock et c'est le seul moment où j'utilise un thread.

    Une idée ? :euh:
    • Partager sur Facebook
    • Partager sur Twitter
      20 mai 2011 à 21:34:20

      ben y a pas un moment où 2 threads tentent d'accéder au même fichier ?
      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        20 mai 2011 à 21:39:00

        Dans mon programme c'est la seule fonction qui accède au fichier et qui utilise les threads, à moins qu'il n'ai pas eu le temps de lire les 100 lignes en 3 secondes avant de recommencer, non.

        Sinon, le jeu lui écrit dans le log régulièrement mais en faisant de la lecture seule ça ne devrait pas me géner me semble t'il.
        • Partager sur Facebook
        • Partager sur Twitter
          20 mai 2011 à 21:42:11

          ben, testes avec une variable+1 au debut et variable-1 à la fin du thread; si à un moment elle passe à 2 c'est que 2 threads tournent en même temps.
          Après si c'est possible d'accéder en lecture à un fichier ouvert en écriture(et vice-versa) je sais pas.
          sinon y a qu' à attendre que la ressource se libère ...

          dans ton code, le fichier reste ouvert "longtemps"; tu devrais peut-être le libérer immédiatement.
          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

            20 mai 2011 à 22:35:58

            Alors :
            OK pour les variables je vais tester

            Je vois pas comment savoir si la ressource est libre.

            Et je ne vois pas comment fermer le fichier plus tôt, tout le for en a besoin, si je met avant, le for pourra pas lire et si je met dedans ça va chercher à me le fermer autant de fois que y'a de lignes donc je le met juste après. Non ?
            • Partager sur Facebook
            • Partager sur Twitter
              20 mai 2011 à 23:44:58

              with open('log.txt',"r") as f: fichier = f.readlines() #ouvert, lu et fermé
              for ligne in fichier:
                  # ton code
              
              • Partager sur Facebook
              • Partager sur Twitter

              Python c'est bon, mangez-en. 

                20 mai 2011 à 23:50:31

                readlines je connaissais mais pour moi ça faisait une liste, pas de quoi pouvoir faire un for ligne in fichier. Merci de l'info :D je teste

                Sinon, j'ai fait le coup des variables et effectivement, en restant 15 minutes j'ai réussi à passer à 3 threads à la fois ...je suis en train d'essayer le timer sur 6 secondes voir si c'est une attente acceptable pour le joueur et si ça permet de tenir.
                • Partager sur Facebook
                • Partager sur Twitter
                  21 mai 2011 à 0:33:52

                  a ta place je n'utiliserai qu'un seul thread.
                  grossièrement ...

                  def mon_thread():
                      t = maintenant + 3 secondes
                      while Game_run:
                          if maintenant >= t:
                              traiter seulement ce qui est nécessaire dans le fichier texte
                              t = t + 3secondes
                              attendre(t-maintenant)
                  


                  • Partager sur Facebook
                  • Partager sur Twitter

                  Python c'est bon, mangez-en. 

                    22 mai 2011 à 16:14:16

                    Bon, même en simplifiant au maximum le code, ça continue à crasher.
                    J'en ai eu marre, injection d'une dll dans le jeu qui est lui aussi en python, les dev ont développé un système de tache répétitives et simple à mettre en place du type task(delai, nomfonction, 'nomdetache') et hop affaire réglée.

                    Merci pour l'aide :)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Timer fait crasher

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown