[omniORB] Multithreading

yashik@veon.com yashik@veon.com
Mon Nov 18 15:51:02 2002


You can not access non static members/methods ('orb' in your case) from a
static method.
You should either make your 'orb' variable static or get an instance of the
Orb from the CORBA::ORB_init method

For example,
class MyClass
{
private:
     static CORBA::ORB_var orb;


     static void runORB() {
          try {
               cerr << "Server is running!" << endl;
               orb->run();
          }
          catch(...) {
               cerr << "Caught unknown exception." << endl;
          }
     }

public:
     static init(int argc,char* argv[]) {
          orb = CORBA::ORB_init(argc,argv,"omniORB3");
      }
     static void MyClass::startThread() {
     ...
     }
};

...
int main(int argc,char* argv[])
{
     MyClass.init(argc,argv);
     MyClass.startThread();
}


another way could be to change your runOrb:
void runORB() {
     try {
          cerr << "Server is running!" << endl;
          int argc = 0;
          CORBA::ORB_var orb = CORBA::ORB_init(argc,NULL,"omniORB3");
          orb->run();
     }
     catch(...) {
          cerr << "Caught unknown exception." << endl;
     }
}

In this case you should first call   CORBA::ORB_init in main with 'real'
parameters.

Also, you can pass the pointer to your instance as a parameter to the
thread function:

void MyClass::startThread() {
     hThread[0] = CreateThread(NULL,0,MyClass::ThreadFunc,(void*)this,0,
&dwThreadID[0]);
     ...
}

DWORD WINAPI MyClass::ThreadFunc(LPVOID p) // should be static
{
     MyClass* self = (MyClass*) p;
     self->runORB();
}

HTH,
Yakov

P.S.
     This is not a compiled solution




                                                                                                                                 
                    "Uli Syber"                                                                                                  
                    <uli.syber@schraml.de>             To:     omniorb-list@omniorb-support.com                                  
                    Sent by:                           cc:                                                                       
                    omniorb-list-admin@omniorb-s       Subject:     [omniORB] Multithreading                                     
                    upport.com                                                                                                   
                                                                                                                                 
                                                                                                                                 
                    18/11/2002 16:55                                                                                             
                                                                                                                                 
                                                                                                                                 




Hi,

System:
I use omniORB 4.0.0 on a win 32 architecture. My operation system is WIN
2000 and I use VC++ 6.0:

Problem:
Iīd like to start an omniORB server in my program as a background thread
(worker thread). Therefore I have tried the following:



#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
/////////////////////////////////////////////////////////////////////////////////////////////////

class MyClass
{
           private:
                     CORBA::ORB_var orb;
                     static DWORD WINAPI ThreadFunc();
                     void startThread();

           public:
                     void runORB();

};
/////////////////////////////////////////////////////////////////////////////////////////////////

void MyClass::runORB()
{
           try
           {
                     cerr << "Server is running!" << endl;
                     orb->run();
           }
           catch(...)
           {
                     cerr << "Caught unknown exception." << endl;
           }
}
DWORD WINAPI MyClass::ThreadFunc()
{

           runORB();                      //Proplem: Isnīt a static member
because auf orb->run();

           return((DWORD)0);

}
void MyClass::startThread()
{

           hThread[0] = CreateThread(NULL,0,MyClass::ThreadFunc,NULL,0,
&dwThreadID[0]);
           WaitForMultipleObjects(
MAX_THREADS,hThread,TRUE,INFINITE);

           printf("Thread is running!");


}

CreateThread(...) need a static function like MyClass::ThreadFunc
().Threrefore must runORB() in ThreadFunc() actually also a static method.
But in runORB() I call orb->run() witch gets on the heap. Iīve tried to
include CORBA.h to get an instance of ORB_var but it doesnīt work.


Question:
How can I get orb->run() as a background work?


greetings,
Uli




_______________________________________________
omniORB-list mailing list
omniORB-list@omniorb-support.com
http://www.omniorb-support.com/mailman/listinfo/omniorb-list