Multithreaded COM server problem...

Mark Hammond mhammond at skippinet.com.au
Mon Jan 12 00:48:27 EST 2004


John Lull wrote:
> Mark Hammond <mhammond at skippinet.com.au> wrote (with possible deletions):
> 
> 
>>John Lull wrote:
>>
>>
>>>I'm writing a multithreaded COM server to manage a pool of hardware resources.
>>>All objects are designed to be thread-safe, and I've set sys.coinit_flags to
>>>COINIT_MULTITHREADED before importing pythoncom.
>>
>>Note that this flag is effeectively ignored for the server.  Objects are 
>>created in the same "apartment" as their creator.  This, the code 
>>implementing your object need not specify this, but the code *creating* 
>>the object must.  This is what determines the appartment.
>>
>>COM threading rules are complex, but "Python Programming on Win32" (1/2 
>>by me :) covers these rules in words I would have trouble finding again :)
> 
> 
> It covers threading rules for in-process servers pretty thoroughly.
> 
> Unfortunately, this one has to be a local server since it's providing shared
> access to a pool of hardware devices from multiple distributed clients. I've
> carefully reviewed chapters 5 & 12, and appendix D, and wasn't able to find
> anything addressing threading models in the local server in detail. If I've
> missed something, I'd be grateful for any additional hints. 

The problem is that your client code is not running a message loop.  If 
you change the loop of your client test code to something like:

for i in range(delay)*10:
     time.sleep(0.1)
     pythoncom.PumpWaitingMessages()

It works as you expect.  A better choice would probably be 
win32event.MsgWaitForMultipleObjects, but that depends on what your app 
really does.

Mark.




More information about the Python-list mailing list