Link to home
Start Free TrialLog in
Avatar of amitdedhia
amitdedhia

asked on

CoCreateInstance hangs...

I have two threads running in my application. Thread A and Thread B.

Thread A code is like this:

ThreadA()
{
     while (1)
     {
          // do some processing first here
          dword = WaitForSingleObject (hEvent, ?.);
          if (dword == WAIT_OBJECT_0)
               continue;
          else if (dword == WAIT_TIMEOUT)
          {
               Create instance of an InProcServer called IPS using CoCreateInstance();
               // call few functions on IPS
               IPS->Release();
          }
     }
}

Thread B code is like this:

ThreadB()
{
     while (1)
     {
     Create instance of an InProcServer called IPS using CoCreateInstance();;
          // call few functions on IPS
          IPS->Release();
          SetEvent(hEvent); // the event on which thread A is waiting;
          Sleep for some finite time;
     }
}

The problem is as follows. Thread A and thread B are created one after another. If I do not create thread B, everything works well. Thread A periodically creates and releases the inproc server. But if I create therad B, the CoCreateInstance() in thread A does not return (when thread B calls SetEvent(), thread A loops again; waits for some time; times out and tries to create instance of inproc server) and the program hangs. I replaced CoCreateInstance by CoGetClassObject + CreateInstance pair, but the result was same. The code does not even run into DLLGetClassObject function.

Can anybody help me?


Avatar of elcapitan
elcapitan

Do you have CoInitialize() at the begining of each thread?

--EC--
Avatar of amitdedhia

ASKER

elcapitan ,
Yes -  For thread A, I have called CoInitiallise(NULL) before calling CoCreateInstance() and CoUniniitalise() after calling Release. Thus, CoInitiallise() and CoUninitiallise() are called in loop everytime the instance of dll is created.

For thread B, CoInitiallise(NULL) and CoUninitiallise() are called outside the loop.
What threading models do your client and server use?

Regards,

Steve.
What I'm getting at is Multithreaded inproc servers. If your IPS is a multithreaded dll, read Effective COM by Don Box to see why it causes problems.  If not then let me know and I'll keep thinking.

Regards,

Steve.
This is not direct answer to your question, but I think you are spending too much time creating and killing those objects, especialy opening and closing COM in the loop of thread A. Is there a reason not to create the IPS in the process creating the threads, pass the object pointer to both threads and keep it alive while needed? And, of course move the CoInitialize() in the A outside of the loop.
This way, you may resolve your problem indirectly and certainly increase the app's performance...
Steve,

My IPS is a multi-threaded DLL. I'll look into Effective COM.

ekc,
actually i determine at runtime which dll to load i.e. IPS is different at different times. I read some information from the registry and get the CLSID of the required IPS. then I call CoCreateInstance(). I can't afford to load all the DLLs in advance.. since they are too many..

Regards
Amit


I think you forgot this question. I will ask Community Support to close it unless you finalize it within 7 days. Unless there is objection or further activity,  I will suggest to refund the points and PAQ at zero points since nobody had an answer for you.

PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!
======
Werner
ASKER CERTIFIED SOLUTION
Avatar of Netminder
Netminder

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial