[IronPython] Dispatcher Problem

Vernon Cole vernondcole at gmail.com
Tue Jun 7 16:18:57 CEST 2011


I have not tested this on a GUI screen, but...
You should be able to assign any class with a .write() method to sys.stdout
(and/or sys.stderr) so that normal "print" statements/functions and
tracebacks will be sent to that method. I use the trick frequently to get a
simple logging facility by assigning a text file -- like:
<code>
import sys
my_log = open('my_log_file.txt','w')
sys.stdout = my_log
print 'Hello, Log.'
sys.stderr = my_log
error = 1 / 0
</code>
Is that the kind of 'messages' you were thinking about?
--
Vernon

On Tue, Jun 7, 2011 at 2:00 AM, AndyF. <andy_fulstow at hotmail.com> wrote:

>
> 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
> > Users at lists.ironpython.com
> > 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
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20110607/6ab9ef77/attachment.html>


More information about the Ironpython-users mailing list