COM and Threads

T

Teja

I have an application which uses COM 's Dispatch to create a COM based
object. Now I need to upgrade the application to a threaded one. But
its giving an error that COM and threads wont go together. Specifically
its an attribute error at the point where COM object is invoked. Any
pointers please??????
 
H

hg

Teja said:
I have an application which uses COM 's Dispatch to create a COM based
object. Now I need to upgrade the application to a threaded one. But
its giving an error that COM and threads wont go together. Specifically
its an attribute error at the point where COM object is invoked. Any
pointers please??????

If COM is not thread safe, then use processes
 
R

Roger Upole

Teja said:
I have an application which uses COM 's Dispatch to create a COM based
object. Now I need to upgrade the application to a threaded one. But
its giving an error that COM and threads wont go together. Specifically
its an attribute error at the point where COM object is invoked. Any
pointers please??????

An actual traceback would help.
At a guess, when using COM in a thread
you need to call pythoncom.CoInitialize and
CoUninitialize yourself.

Roger
 
H

hg

Teja said:
Thanks a LOT for your reply...... Can u please tell me how to
processes......

I gather pywin32 gives you the trick to do it (CreateProcess ?) as I
gather "fork"ing is not available under Windows.
 
T

Teja

Roger said:
An actual traceback would help.
At a guess, when using COM in a thread
you need to call pythoncom.CoInitialize and
CoUninitialize yourself.

Roger

Actually Roger, this is the scenario....

I create a COM object at the beginnning of the main thread. In the sub
thread, I need to access the same instance of the COM object. If it
were a normal object ie. not a COM obj, i was able to do it. But if it
were a COM object, its giving an attribute error? Should I pass a COM
object to the thread. If so How? Please let me know ASAP... Thnks
 
T

Teja

hg said:
I gather pywin32 gives you the trick to do it (CreateProcess ?) as I
gather "fork"ing is not available under Windows.

Hg, This is the scenario..

I create a COM object in main. I need to access that object in a thread
or subprocess or whatever. Can u pls tell me how to do it. Its a COM
object.

Thnks
 
R

Roger Upole

Teja said:
Actually Roger, this is the scenario....

I create a COM object at the beginnning of the main thread. In the sub
thread, I need to access the same instance of the COM object. If it
were a normal object ie. not a COM obj, i was able to do it. But if it
were a COM object, its giving an attribute error? Should I pass a COM
object to the thread. If so How? Please let me know ASAP... Thnks

To pass COM objects between threads, usually they'll need to be marshaled
using pythoncom.CoMarshalInterThreadInterfaceInStream, and unmarshaled
with pythoncom.CoGetInterfaceAndReleaseStream.

Roger
 
T

Teja

Roger said:
To pass COM objects between threads, usually they'll need to be marshaled
using pythoncom.CoMarshalInterThreadInterfaceInStream, and unmarshaled
with pythoncom.CoGetInterfaceAndReleaseStream.

Roger

I really appreciate your quick reply....Can u please let me know how to
do marshalling and unmarshalling or any good refrences to do it.
Because i tried to do it. I got some errors ans so I left it...

Thnks again...
 
R

Roger Upole

Teja said:
I really appreciate your quick reply....Can u please let me know how to
do marshalling and unmarshalling or any good refrences to do it.
Because i tried to do it. I got some errors ans so I left it...

Thnks again...

Here's a simple example using Internet Explorer.

import win32com.client, pythoncom, thread
ie=win32com.client.Dispatch('internetexplorer.application')
ie.Visible=1

def nav(istream, dest):
pythoncom.CoInitialize()
d=pythoncom.CoGetInterfaceAndReleaseStream(istream, pythoncom.IID_IDispatch)
my_ie=win32com.client.Dispatch(d)
my_ie.Navigate(dest)
pythoncom.CoUninitialize()

s=pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch,ie)
thread.start_new_thread(nav, (s, 'www.google.com'))

Roger
 
T

Teja

Roger said:
Here's a simple example using Internet Explorer.

import win32com.client, pythoncom, thread
ie=win32com.client.Dispatch('internetexplorer.application')
ie.Visible=1

def nav(istream, dest):
pythoncom.CoInitialize()
d=pythoncom.CoGetInterfaceAndReleaseStream(istream, pythoncom.IID_IDispatch)
my_ie=win32com.client.Dispatch(d)
my_ie.Navigate(dest)
pythoncom.CoUninitialize()

s=pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch,ie)
thread.start_new_thread(nav, (s, 'www.google.com'))

Roger

Thnks a lot Roger, Its working gr8..Now, once the thread is started
with start_new_thread, is there any way to terminate it upon user's
request. I have explored and found out that there is no thread.kill().
So wht to do now?

Teja
 
T

Teja

Teja said:
Thnks a lot Roger, Its working gr8..Now, once the thread is started
with start_new_thread, is there any way to terminate it upon user's
request. I have explored and found out that there is no thread.kill().
So wht to do now?

Teja

HI all,

I have a problem in accesing COM objects in threads. To be precise,
lets assume that I have a class GenericFunctions which is defined as
follows:

import win32com.client, pythoncom, thread
ie=win32com.client.Dispatch('internetexplorer.application')
ie.Visible=1

class GenericFunctions:

def __init__(self):
print "In Constructor of Generic Functions"

def MyNavigate(self,dest):
ie.Navigate(dest)


Now there is another file Main.py which is defined as follows:

import win32com.client, pythoncom, thread
from GenericFunctions import *
obj = GenericFunctions()

class Mainclass:
def __init__(self);
print "In Constructor of Main class"

def threadFunction(self,dest):
pythoncom.CoInitialize()
d=pythoncom.CoGetInterfaceAndReleaseStream(s,
pythoncom.IID_IDispatch)
my_ie=win32com.client.Dispatch(d)
obj.func(dest) # this is gving an error.
pythoncom.CoUninitialize()

if __name__ == "__main__":

s=pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch,ie)
thread.start_new_thread(self.nav, (s,'www.google.com')

Basically, I want to access object of GenericFunctions class inside
threadFunction(). However I was able to execute
my_ie.Navigate("google.com"). But that was not I wanted. I am not
knowing where the error is....
Please let me know the solution ASAP...

Teja.P
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,817
Latest member
DicWeils

Latest Threads

Top