2010-08-31 6 views
1

Je viens de sortir avec ma façon de terminer un fil, mais je ne sais pas pourquoi ça ne marche pas. Est-ce que quelqu'un pourrait m'aider s'il vous plaît?Comment se fait-il que cette façon de terminer un thread ne fonctionne pas?

Voici mon exemple de code:

import wx 
import thread 
import time 
import threading 

class TestFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, parent = None, id = -1, title = "Testing", pos=(350, 110), size=(490, 200), style=wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX) 
     self.panel = wx.Panel(self) 

     self.stop = False 

     self.StartButton = wx.Button(parent = self.panel, id = -1, label = "Start", pos = (110, 17), size = (50, 20)) 
     self.MultiLine = wx.TextCtrl(parent = self.panel, id = -1, pos = (38, 70), size = (410, 90), style = wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_AUTO_URL) 


     self.Bind(wx.EVT_BUTTON, self.OnStart, self.StartButton) 
     self.Bind(wx.EVT_CLOSE, self.OnClose) 

    def OnStart(self, event): 
     self.StartButton.Disable() 
     self.NewThread = threading.Thread(target = self.LongRunning) 
     self.NewThread.start() 

    def OnClose(self, event): 
     self.stop = True 
     BusyBox = wx.BusyInfo("Just a moment please!", self) 
     wx.Yield() 

     while True: 
      try: 
       if not self.NewThread.isAlive(): 
        self.Destroy() 
        break 
       time.sleep(0.5) 
      except: 
       self.Destroy() 
       break 

    def LongRunning(self): 
     Counter = 1 

     while True: 
      time.sleep(2) 
      print "Hello, ", Counter 
      self.MultiLine.AppendText("hello, " + str(Counter) + "\n") #If you comment out this line, everything works fine. Why can't I update the fame after I hit the close button? 
      Counter = Counter + 1 
      if self.stop: 
       break 

class TestApp(wx.App): 
    def OnInit(self): 
     self.TestFrame = TestFrame() 
     self.TestFrame.Show() 
     self.SetTopWindow(self.TestFrame) 
     return True 

def main(): 
    App = TestApp(redirect = False) 
    App.MainLoop() 

if __name__ == "__main__": 
    main() 

Comme vous pouvez le voir dans mon code, il y a une boucle infinie dans le fil, ce que je dis le fil à faire est de sortir de la boucle une fois que je clique sur la fin bouton. Mais le problème est, chaque fois que je clique sur le bouton de fermeture, il semble que le code bloqué à self.MultiLine.AppendText("hello, " + str(Counter) + "\n") ligne, je ne sais pas pourquoi. Quelqu'un peut-il aider?

+0

'sinon self.NewThread.isAlive():' Quelle version de python utilisez-vous? 2,5? Vous devriez d'abord mettre à jour votre version de python! –

+0

Je suis déjà sur python 2.7 – Shane

Répondre

2

Essayez d'utiliser un fil méthode sûre telle que la mise à jour de votre wx.CallAfter lors multiligne.

def LongRunning(self): 
    Counter = 1 

    while True: 
     time.sleep(2) 
     print "Hello, ", Counter 

     wx.CallAfter(self.updateMultiLine, "hello, " + str(Counter) + "\n") 
     Counter = Counter + 1 
     if self.stop: 
      break 

def updateMultiLine(self, data): 
    self.MultiLine.AppendText(data) 
+0

Vous avez répondu à quelques-unes de mes questions factices, alors merci beaucoup pour votre patience! – Shane

+0

@Shane: Votre accueil, toujours heureux d'aider! :) – volting

1

En général, avec les toolkits GUI, un seul thread doit accéder aux fonctions de l'interface graphique. Une exception est wx.CallAfter

Comme vous (si) le savent, les défauts logiciels peuvent être classés en trois groupes:

  1. Vos bugs.
  2. Leurs bugs.
  3. Threads.

;)

+0

Je viens de désactiver le bouton de démarrage une fois qu'un thread démarre, c'est un thread accéder aux fonctions de l'interface graphique, ont toujours le même problème ... Quelqu'un pourrait-il me donner une raison détaillée? – Shane

+1

@Shane: "un fil" ne signifie pas "un fil à la fois". Cela signifie que quel que soit le thread qui démarre, la boucle d'événements doit être le seul thread qui met directement à jour l'interface utilisateur. Vous ne pouvez pas créer un thread séparé, puis passer à celui qui met à jour l'interface utilisateur. –

Questions connexes