What Are the Apartment Rules?
For all this complicated machinery to work, there are a number of rules COM imposes on programs that use COM.
The synchronization of calls between different threads is achieved
using Windows messages. This means that all threads in a
single-threaded apartment must run a message loop to allow this
mechanism to work. If the program is a GUI (such as PythonWin) this
is no problem, but for most other applications, including Windows
Services, this may not be an existing requirement. In practice, this
means if any of your threads that exist in a single-threaded COM
apartment need to wait on some synchronization object, you may need
to use either the
win32event.MsgWaitForSingleObject() or
win32event.MsgWaitForMultipleObjects() calls so
you can still process messages at the appropriate time. If you have
no other message requirements, calling
pythoncom.PumpWaitingMessages() processes all
messages currently in the thread’s queue. This technique is
demonstrated in the example in the next section.
The other major rule imposed by the COM threading models is that
it’s illegal to pass COM interface pointers (and therefore the
Python wrappers) between threads. As you may be passing the pointer
from the same apartment to a different apartment, you may be avoiding
or violating the synchronization mechanisms (and other optimizations)
provided by COM. To pass interface objects between threads, you must
use the
pythoncom.CoMarshalInterThreadInterface-InStream()
and pythoncom.CoGetInterfaceAndReleaseStream() ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access