Firing COM events from worker threads

Hi,

I have a EXE COM server running in a Multithreaded apartment.

The application works, but when I come to fire events from a worker
thread I get into all sorts of trouble!

I have three worker threads in a test application as shown below.  If I
start the threads (via three button presses on the server) I have no
problem the Visual Studio built client hears all the events fine.

This is where it gets confussing... When I start the threads via a
Client call (below) all three threads start and fire one event which is
heard by the client, after that each thread gets stuck on the
'Synchronize' call for around fif{*word*249} seconds then frees up but the GUI
is not displayed to after that but the threads are working!

I have tried many things 'marshalling' etc.. nothing works!

Could someone please help?

Thanks in advance

Arron

// **************************
// WORKER THREAD
// **************************
void __fastcall CMCChild::Execute()
{
    CoInitializeEx(NULL, COINIT_MULTITHREADED); // This works fine
removed tests for posting here

    int Badgers = 0;
    // Loop while we have not been asked to terminate the writer
    while (!Terminated)
    {
        //m_MainLog->Add("Child Thread Running", "Child");

        m_MemoText = m_IDString.c_str(); Synchronize(AddToMemo);

        if (m_IDString == "ThreadOne")
            Badgers = 1;
        else if (m_IDString == "ThreadTwo")
            Badgers = 2;
        else
            Badgers = 3;

        if (m_Interface)
        {
            m_Interface->Fire_GiveMeNumber(&Badgers);
        }
        else
            ShowMessage("Hold");
    } // While (!Terminated)
    m_Interface->Release();
    CoUninitialize();

Quote
}

// **********************
// CLIENT CALL
// **********************
STDMETHODIMP TServerMethodsImpl::StartTunes()
{
  try
  {
    TMainForm *MainForm =
dynamic_cast<TMainForm*>(Application->MainForm);
    MainForm->ThreadButtonOneClick(NULL);
    MainForm->ThreadButtonTwoClick(NULL);
    MainForm->ThreadButtonThreeClick(NULL);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IServerMethods);
  }
  return S_OK;
Quote
};