[IronPython] Dispatcher Problem
andy_fulstow at hotmail.com
Tue Jun 7 10:00:51 CEST 2011
Thank you Dino
modifying my Python dispatcher to read
dispatcher.BeginInvoke(System.Action(lambda *_: function(*args)))
fixed the problem. Unfortunately for me, utilising the dispatcher has an
unforseen side effect - the 'messages' printed to my console only appear
when the python script exits.
If I revert the code to bypass all dispatcher code i.e. use the following
def write(self, string):
then I see the messages arrive in real time.
I have tested launching my PythonEngine class using a thread with both
ApartmentState.STA and MTA but this has no discernible effect.
Can you offer any explanation, maybe workaround?
Dino Viehland wrote:
> AndyF wrote:
>> Hi Chaps
>> I have attempted to purloin some of the code shipped with IP in Action
>> 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
>> have a dispatcher on my UI element
>> I have removed all of the threading pipe reading stuff just to leave
>> 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):
>> if textbox != None:
>> listout = ListOutput(textbox)
>> sys.stdout = listout
>> print "Define running"
>> #running = True
>> print "Start The Comms Thread..."
>> #comms_t = Thread(ThreadStart(run_comms))
>> 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
> of delegate to create for you automatically. Instead you can convert the
> Python function into a delegate by calling the delegate type directly,
> 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.
> Users mailing list
> Users at lists.ironpython.com
View this message in context: http://old.nabble.com/Dispatcher-Problem-tp31782357p31789855.html
Sent from the IronPython mailing list archive at Nabble.com.
More information about the Ironpython-users