2011-06-06 4 views
0

J'ai essayé de voler une partie du code livré avec IP en action et, suite à des problèmes, j'ai même pris le temps de lire le livre!Embedded IronPython - Dispatcher Problème

Je reçois l'erreur 'Attendez-vous, obtenez la fonction' lorsque j'utilise le code suivant. Pour votre information, je passe dans une référence à une zone de texte WPF donc je devrais avoir un régulateur sur mon élément d'interface utilisateur

J'ai enlevé tous les trucs de lecture du tuyau de filetage juste pour laisser le code « test »:

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) 

Des indices appréciés.

AndyF.

Répondre

1

Merci à Dino Viehland

Changer mon code dispatcher pour appeler le répartiteur fixe directement cette question.

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

Malheureusement, je n'obtenir une sortie en temps réel de mes impression statments à ma « console » - tout cela apparaît lorsque le script est terminé. Supprimez le répartiteur et il revient en temps réel ...

0

Il existe un ensemble de méthodes statiques de répartiteur (méthodes d'extension) fournies au moyen de DispatcherExtensions qui prennent une Action comme paramètre.

L'exemple de code ci-dessous illustre l'utilisation du répartiteur WPF. Plus d'informations sont disponibles ici http://msdn.microsoft.com/en-us/library/cc647497.aspx

import clr 
clr.AddReference('WindowsBase') 
clr.AddReference('System.Windows.Presentation') 
from System import Action 
from System.Windows.Threading import DispatcherExtensions, Dispatcher 

dispatcher = Dispatcher.CurrentDispatcher 

def workCallBack(): 
    print 'working' 

DispatcherExtensions.BeginInvoke(dispatcher, Action(workCallBack))