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:
@@ -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))
|
||||||
|
Reference in New Issue
Block a user