我的Python RTD服务器不工作,因为线程没有被共同化?
我正在使用这个RTD服务器 我得到一个错误:我的Python RTD服务器不工作,因为线程没有被共同化?,python,excel,com,python-multithreading,pywin32,Python,Excel,Com,Python Multithreading,Pywin32,我正在使用这个RTD服务器 我得到一个错误: pywintypes.com_error: (-2147221008, 'CoInitialize has not been called.', None, None) 当excel类型libe调用InvokeTypes(10,LCID,1,(24,0),(),)时,会发生此错误 我由此得出结论,每当线程想要使用COM时,我都应该调用CoInitialize()。现在我不知道为什么它没有在代码中实现。无论如何,我尝试在Update函数中添加此项,该
pywintypes.com_error: (-2147221008, 'CoInitialize has not been called.', None, None)
当excel类型libe调用InvokeTypes(10,LCID,1,(24,0),(),)
时,会发生此错误
我由此得出结论,每当线程想要使用COM时,我都应该调用CoInitialize()。现在我不知道为什么它没有在代码中实现。无论如何,我尝试在Update函数中添加此项,该函数启动计时器线程:
def Update(self):
# Get our wake-up thread ready...
pythoncom.CoUninitialize()
pythoncom.CoInitialize()
self.ticker = threading.Timer(self.INTERVAL, self.Update)
try:
# Check if any of our topics have new info to pass on
for topic in self.topics.values():
topic.Update(self)
if topic.HasChanged():
refresh = True
if len(self.topics):
refresh = False
topic.Reset()
if refresh:
self.SignalExcel()
finally:
self.ticker.start() # Make sure we get to run again
uninitialize是根据说明import pythoncom独自进行第一次初始化的文档调用的
也许我应该在代码中的其他地方进行初始化
我意识到这个问题的复杂性并没有在这篇文章中解释,所以请提问
公寓居住对象的规则稍微复杂一些。如果所讨论的COM对象是
以InProc DLL以外的任何方式实现(例如,基于LocalServer或RemoteServer)
对象),由于对象在单独的进程中运行,因此该问题变得没有意义
在同一间公寓里。对于DLL实现的对象,单元由
创建对象的线程以及对象实际支持的线程模型
对,这更有意义。但是你引用的段落本质上与你的问题无关,“每次线程想要使用COM时,它都需要调用CoInitialize()”这是不正确的。相反,每个需要使用COM的线程都必须在使用COM之前调用CoInitialize(),并在完成后调用CoUninitialize()。请注意“使用COM(基础设施)”和“使用COM对象”之间的区别。最常见的情况是,使用COM的线程在开始时只调用一次CoInitialize(),在终止前不久只调用一次ConInitialize();但我会给你一些建议。如果您收到该消息,那么发出错误的线程中肯定没有调用CoInitialize()。在手动创建的线程中,这取决于您的代码。然而,在由某些环境管理的线程中,事情变得更加复杂,因为您的代码并不真正拥有线程。例如,线程池中的线程归该池所有,而不是您。在这样一个线程中调用CoInitialize/CoUninitialize是非常危险的,没有文档的直接指导……我不知道计时器是否在单独的线程中触发,但通常这些事情都是通过发送到同一线程的消息来完成的。我真的不知道Python线程,请研究一下。我的直觉是计时器在同一个线程中运行,您应该在程序开始时调用CoInitialize,然后在关闭程序之前调用ConInitialize。但这并不是基于实际的Python COM知识。另外,不要太害怕“长时间打开COM”;它是一个库而不是一个灯泡。此外,COM对象是进程内还是进程外与调用CoInitialize/CoUninitialize的时间基本无关。