ich habe mal ein bisschen mit Threads rumgespielt, dabei ist mir etwas aufgefallen.
Als erstes habe ich eine GUI auf der zwei Buttons sind. Einer startet den Thread/s und der andere Schließt die GUI.
Dazu habe ich eine WorkerThread, der etwas berechnet und sein Ergebnis mittels wx.CallAfter an die Gui übermittelt.
Anschließend warete ich mit thread.join() darauf das er beendet wurde, um danach weiter mit dem Ergebnis des Threads zu arbeiten.
Ich bekomme aber nicht das errechnete Ergebnis, weil nicht gewartet wird bis der Thread fertig ist. Was kann ich tun oder muss ich verändern?
Hier das Beispiel:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import wx
import threading
class MyButtons(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title, size = (300, 200))
wx.Button(self, 1, 'Close', (50, 130))
wx.Button(self, 2, 'Start Thread', (150, 130), (110, -1))
self.liste = None
self.threads = []
self.Bind(wx.EVT_BUTTON, self.OnClose, id = 1)
self.Bind(wx.EVT_BUTTON, self.OnStartThread, id = 2)
self.Centre()
self.ShowModal()
self.Destroy()
def setListe(self, liste):
self.liste = liste
print "SetListe wurde aktiviert: ", self.liste
def OnClose(self, event):
self.Close(True)
def OnStartThread(self, event):
self.liste = None
newThread = WorkerThread(self)
self.threads.append(newThread)
newThread.start()
for thread in self.threads:
thread.join
print "Nach join: ", self.liste
class WorkerThread(threading.Thread):
"""
WorkerThread
"""
def __init__(self, window):
threading.Thread.__init__(self)
self.window = window
self.liste = None
def run(self):
self.liste = self.fillList()
wx.CallAfter(self.window.setListe, self.liste)
def fillList(self):
for i in range(5):
yield i
if __name__ == "__main__":
app = wx.App(0)
MyButtons(None, -1, 'ThreadTest')
app.MainLoop()
Mit freundlichen Grüßen
Schaf220