COM and Threads
Teja
tejovathi.p at gmail.com
Mon Oct 16 04:43:33 EDT 2006
Teja wrote:
> Roger Upole wrote:
> > "Teja" <tejovathi.p at gmail.com> wrote:
> > >
> > > Roger Upole wrote:
> > >
> > >> "Teja" <tejovathi.p at gmail.com> wrote:
> > >> >
> > >> > Roger Upole wrote:
> > >> >
> > >> >> "Teja" <tejovathi.p at gmail.com> wrote:
> > >> >> >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
> > >> >
> > >> > 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
> > >
> > > 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
>
> 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
More information about the Python-list
mailing list