[IronPython] Dispatcher Problem

Dino Viehland dinov at microsoft.com
Mon Jun 6 22:57:58 CEST 2011


AndyF wrote:
> Hi Chaps
> 
> I have attempted to purloin some of the code shipped with IP in Action and,
> following issues, I have even gone to the lengths of reading the book!
> 
> I am getting the error 'expect Delegate, got Function' when I use the
> following code. FYI I am passing in a reference to a WPF textBox so I should
> have a dispatcher on my UI element
> 
> I have removed all of the threading pipe reading stuff just to leave 'test'
> code:
> 
> import System
> import System.IO
> import Avacta.Optim.Server.WebServices
> import Avacta.Optim.Server.DataModel
> import sys
> import clr
> import time
> 
> from System import Console
> from System.Threading import Thread, ThreadStart
> 
> def SetDispatcher(ui_element):
> global dispatcher # needed else "Exception: 'NoneType' object has no
> attribute 'BeginInvoke'"
> dispatcher = ui_element.Dispatcher
> 
> def Dispatch(function, *args):
> dispatcher.BeginInvoke(lambda *_: function(*args))
> 
> def GetDispatchFunction(function):
> return lambda *args: Dispatch(function, *args)
> 
> class ListOutput:
> def __init__(self, textbox):
> self.textbox = textbox
> 
> def write(self, string):
> Dispatch(self.addText, string) # error: "expect Delegate, got Function"
> # self.addText(string) # ok works fine w-w/o dispatcher stuff
> 
> def addText(self, string):
> textbox.AppendText(string)
> 
> if textbox != None:
> listout = ListOutput(textbox)
> sys.stdout = listout
> SetDispatcher(textbox)
> 
> print "Define running"
> #running = True
> 
> Thread.Sleep(0)
> time.sleep(2)
> 
> print "Start The Comms Thread..."
> #comms_t = Thread(ThreadStart(run_comms))
> #comms_t.Start()
> 
> Thread.Sleep(0)
> time.sleep(2)
> 
> Any clues would be greatly appreciated!

The WPF invocation functions just take a type which is typed to "Delegate" 
instead of a type of a specific delegate.  Therefore we don't know what type
of delegate to create for you automatically.  Instead you can convert the
Python function into a delegate by calling the delegate type directly, e.g.:

dispatcher.BeginInvoke(System.Action(lambda *_: function(*args)))

or you can use another delegate type (e.g. System.Action[object]) with the
appropriate signature you need.





More information about the Ironpython-users mailing list