Eventhandler, der Procedure abbricht

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Frederik
User
Beiträge: 11
Registriert: Dienstag 28. April 2009, 00:37

Hallo,

wie kann ich einen Eventhandler realisieren, der eine laufende Funktion vorzeitig abbricht (oder kann man einen Event an eine loop koppeln? :) )?

Mein Programm soll ca. so ausschauen:

Code: Alles auswählen

keyId = wx.NewId()
self.Bind(wx.EVT_MENU, self.EvtAbort, id=keyId)
keyId2 = wx.NewId()
self.Bind(wx.EVT_MENU, self.EvtFlowGo, id=keyId2)

aTable = wx.AcceleratorTable([(wx.ACCEL_NORMAL, wx.WXK_F1, keyId),(wx.ACCEL_NORMAL, wx.WXK_F5, keyId2)])
self.SetAcceleratorTable(aTable)

def EvtFlowGo(self, event):
    while True:
         if a != 1:
             ...
         else:
              break
 
def EvtAbort(self,event):
     global a
     a = 1
     
Das Problem ist dabei nur, dass soblad die Funktion FlowGo laeuft, der Eventhandler auf nichts mehr reagiert, sondern erst, sobald die Prozedur dann fertig ist. Dann ist's aber zu spaet :)

Any ideas/comments?

Danke im Voraus!

Frederik
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Spontan würde ich mal Threads in den Raum werfen.
Das Leben ist wie ein Tennisball.
Frederik
User
Beiträge: 11
Registriert: Dienstag 28. April 2009, 00:37

Danke fuer den Tipp! Habs mittels threading geloest. Eine gute Hilfe war http://www.python-forum.de/topic-3869.html

Code: Alles auswählen

import os, sys, threading

class CheckStatus(threading.Thread):
	def __init__ (self,ausschalter):
		threading.Thread.__init__(self)
		self.ausschalter = ausschalter
	def run(self):
		while True:
			if self.ausschalter.isSet():
				break
			else:
                    ... function to perform

class MainFrame(wx.Dialog):
	def __init__(self, parent, id, title):
		...
        keyId = wx.NewId()
		self.Bind(wx.EVT_MENU, self.EvtAbort, id=keyId)
		keyId2 = wx.NewId()
		self.Bind(wx.EVT_MENU, self.Fct, id=keyId2)

		aTable = wx.AcceleratorTable([(wx.ACCEL_NORMAL, wx.WXK_F1, keyId),(wx.ACCEL_NORMAL, wx.WXK_F5, keyId2)])
		self.SetAcceleratorTable(aTable)
		
		self.ausschalter = threading.Event() 

    def Fct(self, event):
		parallelthread = CheckStatus(self.ausschalter)
		parallelthread.start() 
		
     def EvtAbort(self,event):
	        self.ausschalter.set()
Thx again, EyDu!
Antworten