Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的Python RTD服务器不工作,因为线程没有被共同化?_Python_Excel_Com_Python Multithreading_Pywin32 - Fatal编程技术网

我的Python 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函数中添加此项,该

我正在使用这个RTD服务器

我得到一个错误:

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的时间基本无关。