Le code suivant fonctionne sans erreurs:fil Python: l'application appelée une interface qui est attelée pour un thread différent
self.sim.create_pnl_results(gui_values, dfs)
Ce code me donne une erreur:
thread = Thread(target=self.sim.create_pnl_results, args=(gui_values, dfs))
thread.start()
in _ApplyTypes_ self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args),
com_error: (-2147417842, 'The application called an interface that was marshalled for a different thread.', None, None)
Il semble que les application appelle un objet com quelque part plus bas sur la ligne et parce que je voudrais mettre un gui (QT) sur le dessus, je dois en faire un fil séparé. Comment puis-je éviter le message d'erreur ci-dessus? J'ai lu qu'il est connecté à un problème de Windows. Toutes les suggestions pour le résoudre en python seraient appréciées. Je n'ai aucun contrôle sur les objets com qui sont appelés depuis l'application et je ne vois pas pourquoi cela ferait une différence si je les appelais depuis le thread principal d'un nouveau thread.
plus d'informations sur l'objet com est appelé:
def process_ts(*args):
ts_id, i, dfn , ts_queue = args
pythoncom.CoInitialize()
ts = win32com.client.Dispatch(pythoncom.CoGetInterfaceAndReleaseStream(ts_id, pythoncom.IID_IDispatch))
ts_queue.put(tuple([i , ACRF._com_to_ts(ts, i, dfn)]))
pythoncom.CoUninitialize()
Il semblerait que ce n'est pas l'interface graphique qui cause le problème, c'est l'interface com qui est initialisée par un thread et je ne peux pas y accéder à partir d'un thread séparé. Je n'ai pas encore trouvé comment transférer au mieux l''appartement' vers le nouveau fil – Nickpick
Si vous ne pouvez pas transférer la chose à un nouveau fil, ce qui semble probable, je vais créer une sorte d'interface de wrapper agréable qui vous permet de faites votre communication, si l'interface existante est maladroitecréer un adaptateur pour la chose que vous essayez d'utiliser) –
Le problème est que l'interface com est initialisée avec une importation au début du programme. J'ai ensuite besoin de définir des valeurs avec un bouton dans l'interface graphique et de calculer une sortie avec un autre bouton, donc de manière inhérente les deux boutons créeraient de nouveaux threads. Je n'ai pas vraiment trouvé de moyen de créer un adaptateur pour le moment. – Nickpick