Skip to content

Instantly share code, notes, and snippets.

@weshouman
Forked from vlasenkov/pycom.py
Last active July 28, 2022 05:08
Show Gist options
  • Save weshouman/e7a997dd3eb03263c561fdc6fd0b6eb2 to your computer and use it in GitHub Desktop.
Save weshouman/e7a997dd3eb03263c561fdc6fd0b6eb2 to your computer and use it in GitHub Desktop.
win32com multithreading example
# win32com multithreading example
import sys
import time
from threading import Thread
# sys.coinit_flags has to be set before importing pythoncom and win32com, otherwise the following errors would be showing up
# - The application called an interface that was marshalled for a different thread.
# - This COM object can not automate the makepy process - please run makepy manually for this object
sys.coinit_flags = 0  # pythoncom.COINIT_MULTITHREADED == 0
from pythoncom import (CoInitializeEx, CoUninitialize,
                       COINIT_MULTITHREADED, PumpWaitingMessages)
from win32com.client import Dispatch, WithEvents
 
# COM event handlers
class FirstEventHandler:
    def OnWorkbookOpen(self, Wb):
        print("First thread:  open workbook %s" % Wb.FullName)
 
class SecondEventHandler:
    def OnWorkbookBeforeClose(self, Wb, Cancel):
        print("Second thread: close workbook %s" % Wb.FullName)
 
# main thread
def firstThread():
    client = Dispatch("Excel.Application")
    WithEvents(client, FirstEventHandler)
    # launch the second thread
    thread = Thread(target=secondThread, args=(client,))
    thread.start()
    # event loop 1
    while True:
        PumpWaitingMessages()
        time.sleep(0.5)
 
# other thread worker function
def secondThread(client):
    CoInitializeEx(COINIT_MULTITHREADED)
    WithEvents(client, SecondEventHandler)
    # event loop 2
    while True:
        PumpWaitingMessages()
        time.sleep(0.5)
    CoUninitialize()
 
if __name__ == '__main__':
    firstThread()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment