[Twisted-Python] Connect to a Twisted Perspective Broker from a VB application (using a python com server InProc)

Hi, I need to connect to a PerspectiveBroker from a VB application. I did it with a com server in python, which works fine when the com client is also python code. All the calls must be synchronous to the com server. When Calling from VB it works fine every time if the function used from the com server don't use the reactor. The problem is that when I call (from the VB com client) the functions that uses the twisted reactor it performs well the first time but for the the second time it's called, it stalls. I have to kill the vb executable. The function from the test code is: testBroker() Please can you help me to sheed some light on this? Should I do it another way? Bellow is the code that I am using. Many thanks Miguel ---------------------------------------------------- The code for the python com client : import win32com.client object = win32com.client.Dispatch("Python.TestServer") print object.Hello("test") print object.Hello2("test") print object.testBroker() print object.gettestresult() ---------------------------------------------------- The code for the VB com client: Private Sub TestComServer() Dim y As Object Set y = CreateObject("Python.TestServer") MsgBox y.gettestresult MsgBox y.testBroker() MsgBox y.gettestresult() Set y = Nothing End Sub ---------------------------------------------------- the code for the python comserver: #testcom.py from twisted.spread import pb from twisted.internet import reactor, defer from twisted.python import util import sys import time import socket class HelloWorld: _reg_clsid_ = "{7CC9F362-486D-11D1-BB48-0000E838A65F}" _reg_desc_ = "Python Test COM Server" _reg_progid_ = "Python.TestServer" _public_methods_ = ['testBroker','gettestresult'] def __init__(self): self.sText='sText10' self.reactorFinished=False def get_ip(self): addrs = socket.getaddrinfo(socket.gethostname(), None) addr = addrs[0] IPaddr = addr[4][0] return IPaddr #"localhost" def get_ip(self): return "localhost" def get_port(self): return 8786 def DealWithReactor(self): now = time.localtime(time.time()) factory = pb.PBClientFactory() reactor.connectTCP(self.get_ip(), self.get_port(), factory) d = factory.getRootObject() strt="hello network " + ' ' + time.asctime(now) d.addCallback(lambda object: object.callRemote("echo", strt)) d.addErrback(lambda reason: 'error: '+str(reason.value)) d.addCallback(self.StopReactor) reactor.run() def StopReactor(self,obj): reactor.stop() self.reactorFinished=True self.sText=str(obj) return obj def testBroker(self): self.reactorFinished=False self.DealWithReactor() while self.reactorFinished==False: pass return 'OK testBroker22 self.reactorFinished:' + str( self.reactorFinished) def gettestresult(self): return "gettestresult:" + str(self.sText) if __name__=='__main__': import win32com.server.register win32com.server.register.UseCommandLine(HelloWorld) h=HelloWorld() print(h.gettestresult()) print(h.testBroker()) print(h.gettestresult())
participants (1)
-
Hermínio Miguel Sanches