28.5.2 XDispatcherクラスまたはWDispatcherクラスによる移行
XDispatcherクラスとWDispatcherクラスはVisiBroker ORBランタイムおよびX Window System(またはWindows)イベントループと透過的に動作します。これは,ORB_initに対する最初の呼び出し前に,XDispatcherまたはWDispatcherのインスタンス作成時に動作します。このため,「28.5.1 シングルスレッドVisiBroker ORBの移行」で説明したように,アプリケーションがスレッドセーフとなったら,XDispatcherまたはWDispatcherのリファレンスを単純に削除できます。コードサンプル28-9および28-10にWDispatcher変換の例を示します。
- コードサンプル28-9 移行前のWDispatcher
//. . . hwnd = CreateWindow(szAppName, "AccountServer", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,200,200,NULL, NULL,hInstance,NULL); //Create a WDispatcher instance before calling ORB_init WDispatcher *winDispatcher = new WDispatcher(hwnd); //Initialize the ORB CORBA::ORB_var orb = CORBA::ORB_init(__argc, __argv); //Initialize the BOA CORBA::BOA_var orb = orb->BOA_init(__argc, __argv); //Create the servant AccountImpl server("BankManager"); //Activate the servant on the BOA boa->obj_is_ready(&server); ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); //Enter message loop while(GetMessage(&msy, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; //. . .
- コードサンプル28-10 移行後のWDispatcher
//. . . hwnd = CreateWindow(szAppName, "AccountServer", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,200,200,NULL, NULL,hInstance,NULL); //Initialize the ORB CORBA::ORB_var orb = CORBA::ORB_init(__argc, __argv); //Initialize the POA CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(obj); CORBA::PolicyList policies; policies.length(1); policies [(CORBA::ULong)0 ] = rootPOA->create_lifespan_policy( PortableServer::PERSISTENT); PortableServer::POAManager_var poa_mgr =rootPOA->the_POAManager(); PortableServer::POA_var myPOA =rootPOA->create_POA("bank_agent_poa", poa_mgr,policies); //Create the servant AccountManagerImpl managerServant; //Activate the servant on the POA PortableServer::ObjectId_var managerId = PortableServer::string_to_ObjectId("BankManager"); myPOA->activate_object_with_id(managerId, &managerServant); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); //Enter message loop while(GetMessage(&msy,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; // . . .
WDispatcherまたはXDispatcherを削除する場合,POAを使用可能にするためにアプリケーションを変換するための追加手順は必要ありません。