Как приходи этот способ окончания нити не работает?

StackOverflow https://stackoverflow.com/questions/3609627

  •  25-09-2019
  •  | 
  •  

Вопрос

Я только что вышел с моим способом окончания нити, но я не знаю, почему это не работает. Кто-нибудь, пожалуйста, помогите мне?

Вот мой образец код:

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") Линия, я не знаю почему. Кто-нибудь может помочь?

Это было полезно?

Решение

Попробуйте использовать безопасный метод потока, такой как 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)

Другие советы

В целом с инструментариями GUI только один нить должен получить доступ к функциям GUI. Исключение wx.callafter.

Как вы (должны) знать, дефекты программного обеспечения могут быть классифицированы на три группы:

  1. Ваши ошибки.
  2. Их ошибки.
  3. Потоки.

;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top