代码之家  ›  专栏  ›  技术社区  ›  Shane

为什么这种结束线程的方法不起作用?

  •  1
  • Shane  · 技术社区  · 16 年前

    我刚刚想出了结束一条线的方法,但我不知道为什么它不起作用。有人能帮我吗?

    这是我的示例代码:

    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()
    

    正如您在我的代码中看到的,线程中有一个无限循环,我告诉线程要做的是,一旦单击关闭按钮,就从循环中中断。但问题是,每次我按下“关闭”按钮时,代码似乎都卡在 self.MultiLine.AppendText("hello, " + str(Counter) + "\n") 行,我不知道为什么。有人能帮忙吗?

    2 回复  |  直到 16 年前
        1
  •  2
  •   volting    16 年前

    尝试使用线程安全方法,例如 wx.CallAfter 更新多行时。

     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)
    
        2
  •  1
  •   Ivo van der Wijk    16 年前

    通常,对于GUI工具包,只有一个线程可以访问GUI功能。例外是 wx.CallAfter

    如您所知,软件缺陷可以分为三类:

    1. 你的虫子。
    2. 他们的错误。
    3. 线程。

    ;)

    推荐文章