同時クエリを実行できるように、ヒストリアン サーバーにクエリを実行するプログラムでスレッドを動作させようとしています。すべてのワーカー スレッドでサーバー オブジェクトをインスタンス化するのではなく、プログラムで受け渡しできるサーバーの単一のインスタンスが必要です。
私が抱えている問題は、「iHistorian_SDK.Server」を使用すると CoGetInterfaceAndReleaseStream を呼び出すとプログラムがハングすることですが、「Excel.Application」などの他のものを使用すると正常に動作します。これは Historian SDK の制限ですか? それを機能させる方法はありますか?
import threading
import time
import pythoncom
import win32com.client
def run_in_thread(hist_id):
# Initialize
pythoncom.CoInitialize()
# Get instance from the id
hist = win32com.client.Dispatch(
pythoncom.CoGetInterfaceAndReleaseStream(hist_id, pythoncom.IID_IDispatch))
time.sleep(5)
pythoncom.CoUninitialize ()
if __name__ == '__main__':
pythoncom.CoInitialize () # Is this needed in the main thread?
hist = win32com.client.Dispatch("iHistorian_SDK.Server") #"Excel.Application"
hist_id = pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch, hist)
thread = threading.Thread(target=run_in_thread, kwargs={'hist_id': hist_id})
thread.start()
thread.join()