Blender app.timer не работает одновременно с серверным потоком python -os c - PullRequest
0 голосов
/ 15 марта 2020

Я хочу запустить сервер python -os c одновременно с app.timer в сценарии python. Проблема в том, что я могу заставить сервер и таймер работать отдельно, но не вместе. Отображения диспетчера содержатся во внешнем конфигурационном файле, и это, кажется, работает нормально. Кажется, что-то в работающем сервере нарушает таймер. Интересно, может ли какая-нибудь добрая душа помочь? Любые предложения будут приветствоваться. Спасибо заранее ... Это тестовая установка:

def  DataPathsImport():  
    print("Reading in config data...") 
    with open("/Users/<path_to_config_file>/linker_config.yaml", 'r') as y:
        dlinks = (yaml.load(y, Loader=yaml.SafeLoader)) 

def print_hello():
    print("hello")
    return 1.0

class OSC_Server(bpy.types.Operator):
    """Set up server"""
    bl_idname = "wm.osc_server_operator"
    bl_label = "OSCMainThread"

    count= 0 

    def execute(self, context):
        global _report

        try:
            self.dispatcher = dispatcher.Dispatcher()
            links = DataPathsImport()
            for link in links:
                dataTuple = (link.get('tag'), link.get('dpath'), link.get('dtype'), \
                    link.get('action'))
                self.dispatcher.map(link.get('addr'), osc_callback_router, dataTuple)
        except: # be specific with error type
            print(f"There has been an error when assigning address: {link.get('addr')}")
        try: 
            print(f"Creating server on port: {port}, at ip address: {ip}")
            self.server = BlockingOSCUDPServer((ip, port), self.dispatcher) 
            self.server_thread = threading.Thread(target=self.server.serve_forever())
            self.server_thread.start()
            bpy.app.timers.register(print_hello)

        except OSError as err:
            _report[1] = err
            return {'CANCELLED'}

    def cancel(self, context):
        print("OSC server.shutdown()")
        self.server.shutdown()
        return {'CANCELLED'}


classes = {
    OSC_Server
}


def register():
    from bpy.utils import register_class
    for cls in classes:
        register_class(cls)


def unregister():
    from bpy.utils import unregister_class
    for cls in reversed(classes): # unregister classes in the reverse order that they were registered
        unregister_class(cls)

if __name__ == "__main__":
    register()
    bpy.ops.wm.osc_server_operator()
...