在主代码运行时,保持Python COM本地服务器并行监听打开

2024-04-29 05:23:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试建立一个COM服务器来获取实时信息。问题是,当localserver打开时,所有其他功能都会停止。其余代码仅在本地服务器关闭时运行。你知道吗

我一直在寻找解决方案,但尝试多重处理却失败了,不是因为这样做行不通,我想是因为我很差劲。不管怎样,我被困在这一部分。你知道吗

import pythoncom
import win32com
from win32com.server import localserver
from multiprocessing import Process

class PythonUtilities(object):

    _reg_clsid_      = '{D9C54599-9011-4678-B1EB-A07FD272F0AF}'
    _reg_desc_       = "Change information between programs"
    _reg_progid_     = "Python.LetsTalk"
    _public_attrs_   = ['speech', 'roger']
    _readonly_attrs_ = ['roger']
    _public_methods_ = ['talktome']

    def __init__(self):
        self.roger  = 'roger'
        self.speech = None

    def talktome(self,speech):
        self.speech = speech
        print ('New speech received: ' + self.speech)
        return self.roger

### ___ ###

def runserver(mess):
    print(mess)
    localserver.serve(['{D9C54599-9011-4678-B1EB-A07FD272F0AF}'])

if __name__=='__main__':

     pu = PythonUtilities

     print ("Registering COM Server ")
     win32com.server.register.UseCommandLine(pu)

     # Fine so far.
     # The problem starts here:

     localserver.serve(['{D9C54599-9011-4678-B1EB-A07FD272F0AF}'])

     #... rest of the code waiting for localserver be closed

     # Experiment... Doesnt work:
     #proc = Process(target=runserver, args = ('starting process',))
     #proc.start()
     #proc.join()

重要的是,从客户端发送的所有消息似乎都正确显示,但只有在我手动关闭本地服务器之后。我想像聊天软件一样实时接收。我的意思是,我希望本地服务器保持打开状态,并且能够处理代码其余部分接收到的信息。你知道吗


Tags: importself服务器comdefprocregspeech
1条回答
网友
1楼 · 发布于 2024-04-29 05:23:45

我的问题解决了重写localserver.server服务()函数并在新线程中启动它,如下所示。你知道吗

import pythoncom
from win32com.client import Dispatch # to get attributes
from win32com.server import register, factory
from threading import Thread
from queue import Queue

class PythonUtilities(object):

    _reg_clsid_      = '{D9C54599-9011-4678-B1EB-A07FD272F0AF}'
    _reg_desc_       = "Change information between programs"
    _reg_progid_     = "Python.LetsTalk"
    _public_attrs_   = ['speech']
    _public_methods_ = ['talktome']

    queue_speech = Queue()

    def talktome(self,speech):
        self.queue_speech.put(speech)
        print ('New speech received: ' + speech)
        return 'roger'

### ___ ###

# use instead localserver.serve()
def runserver():

    # added - multithread support
    pythoncom.CoInitialize()

    clsids = ['{D9C54599-9011-4678-B1EB-A07FD272F0AF}']

    infos = factory.RegisterClassFactories(clsids)

    # commented - from original localserver.serve() method
    #pythoncom.EnableQuitMessage(win32api.GetCurrentThreadId())  

    pythoncom.CoResumeClassObjects()

    pythoncom.PumpMessages()

    factory.RevokeClassFactories( infos )

    pythoncom.CoUninitialize()

 if __name__=='__main__':

    #use this
    server_thread = Thread(target=runserver) # Process works as well
    server_thread.start()

    #instead this     
    #localserver.serve(['{D9C54599-9011-4678-B1EB-A07FD272F0AF}'])

    #... rest of the code now works in parallel

此外,我还做了一些改进,比如排队,以便以后获取数据。我希望它能帮助别人。你知道吗

相关问题 更多 >