Tweaks and cleanup

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41253 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2006-09-16 19:50:26 +00:00
parent 5acb46e0cd
commit 24648f5583

View File

@@ -16,62 +16,49 @@ not even possible to Abort.
""" """
import wx import wx
from wx.lib.delayedresult import startWorker import wx.lib.delayedresult as delayedresult
class FrameSimpleDelayedGlade(wx.Frame):
class FrameSimpleDelayedBase(wx.Frame):
def __init__(self, *args, **kwds): def __init__(self, *args, **kwds):
# begin wxGlade: FrameSimpleDelayed.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds) wx.Frame.__init__(self, *args, **kwds)
self.checkboxUseDelayed = wx.CheckBox(self, -1, "Use delayedresult") pnl = wx.Panel(self)
self.buttonGet = wx.Button(self, -1, "Get") self.checkboxUseDelayed = wx.CheckBox(pnl, -1, "Using delayedresult")
self.buttonAbort = wx.Button(self, -1, "Abort") self.buttonGet = wx.Button(pnl, -1, "Get")
self.slider = wx.Slider(self, -1, 0, 0, 10, size=(100,-1), style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS) self.buttonAbort = wx.Button(pnl, -1, "Abort")
self.textCtrlResult = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY) self.slider = wx.Slider(pnl, -1, 0, 0, 10, size=(100,-1),
style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS)
self.textCtrlResult = wx.TextCtrl(pnl, -1, "", style=wx.TE_READONLY)
self.__set_properties()
self.__do_layout()
self.Bind(wx.EVT_BUTTON, self.handleGet, self.buttonGet)
self.Bind(wx.EVT_BUTTON, self.handleAbort, self.buttonAbort)
# end wxGlade
def __set_properties(self):
# begin wxGlade: FrameSimpleDelayed.__set_properties
self.SetTitle("Simple Examle of Delayed Result")
self.checkboxUseDelayed.SetValue(1) self.checkboxUseDelayed.SetValue(1)
self.checkboxUseDelayed.Enable(False) self.checkboxUseDelayed.Enable(False)
self.buttonAbort.Enable(False) self.buttonAbort.Enable(False)
# end wxGlade
def __do_layout(self): vsizer = wx.BoxSizer(wx.VERTICAL)
# begin wxGlade: FrameSimpleDelayed.__do_layout hsizer = wx.BoxSizer(wx.HORIZONTAL)
sizerFrame = wx.BoxSizer(wx.VERTICAL) vsizer.Add(self.checkboxUseDelayed, 0, wx.ALL, 10)
sizerGetResult = wx.BoxSizer(wx.HORIZONTAL) hsizer.Add(self.buttonGet, 0, wx.ALL, 5)
sizerUseDelayed = wx.BoxSizer(wx.HORIZONTAL) hsizer.Add(self.buttonAbort, 0, wx.ALL, 5)
sizerUseDelayed.Add(self.checkboxUseDelayed, 0, wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) hsizer.Add(self.slider, 0, wx.ALL, 5)
sizerFrame.Add(sizerUseDelayed, 1, wx.EXPAND, 0) hsizer.Add(self.textCtrlResult, 0, wx.ALL, 5)
sizerGetResult.Add(self.buttonGet, 0, wx.ADJUST_MINSIZE, 0) vsizer.Add(hsizer, 0, wx.ALL, 5)
sizerGetResult.Add(self.buttonAbort, 0, wx.ADJUST_MINSIZE, 0) pnl.SetSizer(vsizer)
sizerGetResult.Add(self.slider, 0, wx.ADJUST_MINSIZE, 0) vsizer.SetSizeHints(self)
sizerGetResult.Add(self.textCtrlResult, 0, wx.ADJUST_MINSIZE, 0)
sizerFrame.Add(sizerGetResult, 1, wx.ALL|wx.EXPAND, 5) self.Bind(wx.EVT_BUTTON, self.handleGet, self.buttonGet)
self.SetAutoLayout(True) self.Bind(wx.EVT_BUTTON, self.handleAbort, self.buttonAbort)
self.SetSizer(sizerFrame)
sizerFrame.Fit(self)
sizerFrame.SetSizeHints(self)
self.Layout()
# end wxGlade
class FrameSimpleDelayed(FrameSimpleDelayedGlade):
class FrameSimpleDelayed(FrameSimpleDelayedBase):
"""This demos simplistic use of delayedresult module.""" """This demos simplistic use of delayedresult module."""
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
FrameSimpleDelayedBase.__init__(self, *args, **kwargs)
self.jobID = 1 self.jobID = 1
FrameSimpleDelayedGlade.__init__(self, *args, **kwargs)
self.Bind(wx.EVT_CLOSE, self.handleClose) self.Bind(wx.EVT_CLOSE, self.handleClose)
def setLog(self, log): def setLog(self, log):
self.log = log self.log = log
@@ -81,20 +68,22 @@ class FrameSimpleDelayed(FrameSimpleDelayedGlade):
your app would exit so this would not happen.""" your app would exit so this would not happen."""
if self.buttonAbort.IsEnabled(): if self.buttonAbort.IsEnabled():
self.Hide() self.Hide()
import time wx.FutureCall(5000, self.Destroy)
time.sleep(5) else:
self.Destroy() self.Destroy()
def handleGet(self, event): def handleGet(self, event):
"""Compute result in separate thread, doesn't affect GUI response.""" """Compute result in separate thread, doesn't affect GUI response."""
self.buttonGet.Enable(False) self.buttonGet.Enable(False)
self.buttonAbort.Enable(True) self.buttonAbort.Enable(True)
self.log( "Starting job %s in producer thread: GUI remains responsive" % self.jobID ) self.log( "Starting job %s in producer thread: GUI remains responsive"
startWorker(self.__handleResult, self.__resultCreator, % self.jobID )
wargs=(self.jobID,), jobID=self.jobID) delayedresult.startWorker(self._resultConsumer, self._resultProducer,
wargs=(self.jobID,), jobID=self.jobID)
def __resultCreator(self, jobID): def _resultProducer(self, jobID):
"""Pretend to be a complex worker function or something that takes """Pretend to be a complex worker function or something that takes
long time to run due to network access etc. GUI will freeze if this long time to run due to network access etc. GUI will freeze if this
method is not called in separate thread.""" method is not called in separate thread."""
@@ -102,6 +91,7 @@ class FrameSimpleDelayed(FrameSimpleDelayedGlade):
time.sleep(5) time.sleep(5)
return jobID return jobID
def handleAbort(self, event): def handleAbort(self, event):
"""Abort actually just means 'ignore the result when it gets to """Abort actually just means 'ignore the result when it gets to
handler, it is no longer relevant'. We just increase the job ID, handler, it is no longer relevant'. We just increase the job ID,
@@ -110,8 +100,9 @@ class FrameSimpleDelayed(FrameSimpleDelayedGlade):
self.buttonGet.Enable(True) self.buttonGet.Enable(True)
self.buttonAbort.Enable(False) self.buttonAbort.Enable(False)
self.jobID += 1 self.jobID += 1
def __handleResult(self, delayedResult): def _resultConsumer(self, delayedResult):
# See if we still want the result for last job started # See if we still want the result for last job started
jobID = delayedResult.getJobID() jobID = delayedResult.getJobID()
if jobID != self.jobID: if jobID != self.jobID:
@@ -136,29 +127,30 @@ class FrameSimpleDelayed(FrameSimpleDelayedGlade):
self.jobID += 1 self.jobID += 1
class FrameSimpleDirect(FrameSimpleDelayedGlade): class FrameSimpleDirect(FrameSimpleDelayedBase):
"""This does not use delayedresult so the GUI will freeze while """This does not use delayedresult so the GUI will freeze while
the GET is taking place.""" the GET is taking place."""
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.jobID = 1 self.jobID = 1
FrameSimpleDelayedGlade.__init__(self, *args, **kwargs) FrameSimpleDelayedBase.__init__(self, *args, **kwargs)
self.checkboxUseDelayed.SetValue(False) self.checkboxUseDelayed.SetValue(False)
def setLog(self, log): def setLog(self, log):
self.log = log self.log = log
def handleGet(self, event): def handleGet(self, event):
"""Use delayedresult, this will compute """Use delayedresult, this will compute result in separate
result in separate thread, and won't affect GUI response. """ thread, and will affect GUI response because a thread is not
used."""
self.buttonGet.Enable(False) self.buttonGet.Enable(False)
self.buttonAbort.Enable(True) self.buttonAbort.Enable(True)
self.log( "Doing job %s without delayedresult (same as GUI thread): GUI hangs (for a while)" % self.jobID ) self.log( "Doing job %s without delayedresult (same as GUI thread): GUI hangs (for a while)" % self.jobID )
result = self.__resultCreator(self.jobID) result = self._resultProducer(self.jobID)
self.__handleResult( result ) self._resultConsumer( result )
def __resultCreator(self, jobID): def _resultProducer(self, jobID):
"""Pretend to be a complex worker function or something that takes """Pretend to be a complex worker function or something that takes
long time to run due to network access etc. GUI will freeze if this long time to run due to network access etc. GUI will freeze if this
method is not called in separate thread.""" method is not called in separate thread."""
@@ -170,7 +162,7 @@ class FrameSimpleDirect(FrameSimpleDelayedGlade):
"""can never be called""" """can never be called"""
pass pass
def __handleResult(self, result): def _resultConsumer(self, result):
# output result # output result
self.log( "Got result for job %s: %s" % (self.jobID, result) ) self.log( "Got result for job %s: %s" % (self.jobID, result) )
self.textCtrlResult.SetValue(str(result)) self.textCtrlResult.SetValue(str(result))