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を使用可能にするためにアプリケーションを変換するための追加手順は必要ありません。