Kデスクトップ環境

2.12. KOMシャットダウンマネージャー

異なる処理で稼働するKOMオブジェクトを動作する際、KDEはリソースの使用を最小限にするため、要求があり次第、自動的にこれらの処理を開始するツールを提供します。 KDEデーモンがこの機能を提供しますが、同様の方法で、他の処理を随時開始させたいなら、使わなくなったときにはそれらの処理をシャットダウンが必要かもしれません。 CORBAは、これに関していかなる規格も定義しないので、その独自のメカニズムについても説明しなければなりませんでした。

ですから基本的な質問は: 処理の中で全オブジェクトが停止されたと確信できるのはいつか ? ということです。 この質問に答えられれば、ORBを、それゆえ処理をいつシャットダウンするのかがわかります。

これに対する第一歩は、特定のオブジェクトがいつ停止されるのかを知ることです。 この答えはとても単純で: あるオブジェクトがもうリファレンスされなくなったとき、そのオブジェクトのリファレンスカウンタはゼロに低下し、オブジェクトはリリースされす。

ですからサーバプロセスがいつ"不使用"になったかを発見するためKOMのアプローチは、全KOMベースオブジェクトが停止されているか見るためです。というのはこのオブジェクトは、オブジェクト のライフサイクルに対して有効なサーバ側のリファレンスカウンタを実装しているからです。

KOMシャットダウンマネージャークラスは、このアプローチを実装するためのヘルパークラスです。これは KOMShutdownManager::self()経由でにアクセスする1-インスタンスクラスです。 ですからこれを作成したり削除したりすることについて気を配る必要はありません。

サーバアプリケーションにそれがもう必要でなくなったとき、自動的にシャットダウンさせるなら、 KOMシャットダウンマネージャーの使用は次のように行われます:

このクラスに、それが監視すべき全オブジェクトについて伝えなければなりません。 そして全ての監視されているオブジェクトが停止すると、タイマー(タイムアウト値はデフォルトでは1分ですが、これは設定できます)仕掛けてくれます。 タイムアウトになるとORBはシャットダウンし、アプリケーションも終了します。

ですから、リモートクライアント用オブジェクトが作成されるアプリケーションでの全ての場所 (大抵はファクトリ内)に、次ぎのような単純な一行を追加する必要があるかも知れません:
   1 ... (コード内で)
   2 //基本オブジェクトの作成
   3 MyFooObject *obj = new MyFooObject;
   4 
   5 //KOMShutdownManager がこのオブジェクトを監視していることの伝達
   6 KOMShutdownManager::self()->watchObject( obj );
   7 ...

いかがですか、自明でしょ? :-) 参考までに、kdelibs/corba/tutorials/kdedのkdedサンプルをご覧になるといいかもしれません。 KOMシャットダウンマネージャーかそこでも使われています。

説明不足だったり理解しにくかったりした場合は、どうぞ質問をなげてください。 私宛<hausmann@kde.org>に簡単なメールをお送りください。