Не отключайте прослушивание локального сервера Python COM в paralallel, пока выполняется основной код - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь создать COM-сервер для получения информации в режиме реального времени. Проблема заключается в том, что все остальные функции останавливаются, пока открыт локальный сервер. Остальная часть кода запускается только когда локальный сервер закрыт.

Я искал решения и не смог попробовать мультипроцессор не потому, что это не сработает, я думаю, потому что я отстой. Во всяком случае, я застрял в этой части.

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()

Важно сказать, что все сообщения, отправленные с клиента, отображаются правильно, НО ТОЛЬКО ПОСЛЕ того, как я закрываю локальный сервер вручную. Я хочу получать его в режиме реального времени, как приложение для чата. Я хочу сохранить локальный сервер открытым и иметь возможность работать с информацией, полученной в остальной части кода.

1 Ответ

0 голосов
/ 14 ноября 2018

Моя проблема была решена, переписав функцию localserver.serve () и запустив ее в новом потоке, как показано ниже.

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

Также я сделал некоторые улучшения, такие как Очередь, чтобы получить данные позже. Я надеюсь, что это может помочь другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...