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):
self.texbox.AppendText(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?
Thanks
AndyF.
Dino Viehland wrote:
>
> 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.
>
>
> _______________________________________________
> Users mailing list
> [email protected]
> http://lists.ironpython.com/listinfo.cgi/users-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.
_______________________________________________
Users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com