ActiveX/COM 구성 요소를 만들 때 구성 요소에 대한 스레딩 모델을 지정할 수 있습니다. 예를 들어. "compartmentalized". 어떤 것을 선택 하느냐에 따라 ActiveX/COM이 직렬화 요청을 처리합니다.
"열기"및 ActiveX/COM 구성 요소를 여러 번 (스레딩 모델에 따라 다름) 하나의 인스턴스 만 실제로 생성됩니다.
ActiveX/COM 구성 요소를 "열기"위해 win32com.client.Dispatch (".")를 사용한다고 가정합니다.
또한 pythoncom.CoInitialize()와 CoUninitialize() 호출 쌍을 잊지 마십시오.
구글이 실제로하는 일에 관한 것.
해당 ActiveX/COM 구성 요소를 변경할 수없고 해당 스레딩 모델을 사용할 수없는 경우 모니터 "인터페이스"가있는 전용 파이썬 스레드에서 모든 "아웃 바운드"호출을 래핑 할 수 있습니다.
class Driver(threading.Thread):
quit = False # graceful exit
con = None
request = None
response = None
def __init__(self, **kw):
super(Driver, self).__init__(**kw)
self.setDaemon(True) # optional, helps termination
self.con = threading.Condition()
self.request = None
self.response = None
def run(self):
pythoncom.CoInitialize()
handle = win32com.client.Dispatch("SomeActiveX.SomeInterface")
try:
with self.con:
while not self.quit:
while not self.request: self.con.wait() # wait for work
method, args = self.request
try: self.response = getattr(handle, method)(*args), None # buffer result
except Exception, e: self.response = None, e # buffer exception
self.con.notifyAll() # result ready
finally:
pythoncom.CoUninitialize()
def call(method, *args):
with self.con:
while self.request: self.con.wait() # driver is busy
self.request = method, args
self.con.notifyAll() # driver can start
while not self.response: self.con.wait() # wait for driver
rv, ex = self.response
self.request = self.response = None # free driver
self.con.notifyAll() # other clients can continue
if ex: raise ex
else: return rv
스레드에서 새로운 인스턴스를 만드는 문제가 무엇 :
여기에 한번 비슷한 상황에 직면 쓴 코드에 대한 개요입니까? 그냥 그것을 피하기 위해? – Quintium
좋은 질문입니다. 나는 원래의 질문을 중요한 세부 사항으로 업데이트했다. – tosa
ActiveX는 GUI 스레드와 STA가 호출 할 수 있습니다. [이 게시물을 참조하십시오] (http://stackoverflow.com/questions/5497796/background-worker-issue). ActiveX 스레드를 사용하려면 백그라운드 스레드에서 GUI 스레드로 호출을 마샬링해야합니다. –