2015-03-05 1 views
0

J'ai écrit un programme de messagerie et j'ai rencontré un problème lors du test. Si je veux envoyer des messages à des intervalles de temps différents, disons 100, 200 et 300 millisecondes, le programme prend la première fois et l'applique à tous les messages, mais si j'inclue le after dans une boucle, il envoie les messages à vitesses de 3 à 419 ms?exécutions périodiques avec tkinter

Est-ce que quelqu'un pourrait me conseiller comment appliquer différents temps d'attente à différents messages?

global running 
     i_ref = 0 
     items = self.Translist.curselection() 

     for i in items: 
      i_ref = int(i) 
      if(int(transList[i_ref].tTimer) <= 0): 
       pass 
      else: 
       if running == 0: 
        self.retrans = self.window.after(transList[i_ref].tTimer, self.Enter) 
        self.TranButton.config(state = 'disabled') 
       else:  
        running = 0 
        self.window.after_cancel(self.retrans) 

      system('echo "%s %s 0x%s %d 0x%s 0x%s 0x%s 0x%s 0x%s 0x%s 0x%s 0x%s" >/dev/pcan33' % 
       (transList[i_ref].msgType, 
       transList[i_ref].canType, 
       transList[i_ref].canID, 
       int(transList[i_ref].DLC), 
       transList[i_ref].tData0, 
       transList[i_ref].tData1, 
       transList[i_ref].tData2, 
       transList[i_ref].tData3, 
       transList[i_ref].tData4, 
       transList[i_ref].tData5, 
       transList[i_ref].tData6, 
       transList[i_ref].tData7)) 

Ceci est le code de fonction jusqu'à présent, il est appelé via une pression sur le bouton.

Répondre

0

after seulement garantit d'exécuter quelque chose parfois après l'heure donnée, pas exactement à l'intervalle spécifié. Si vous spécifiez 100ms, cela peut être 100ms, 101 ou 200 ou n'importe quoi d'autre. Ce n'est pas une minuterie haute résolution en temps réel. Dans un système avec une charge légère, c'est généralement assez proche. Rappelez-vous que tkinter s'exécute dans un seul thread et ne peut faire qu'une seule chose à la fois. Si vous planifiez quelque chose 100ms dans le futur, puis que vous commencez à exécuter du code qui prend 200ms pour terminer, le minuteur ne peut pas exécuter quoi que ce soit jusqu'à ce que ce code soit terminé, donc même si vous demandez 100ms, il sera 200ms ou plus attendre que l'autre code se termine.