(57)【特許請求の範囲】
【請求項１】
複数のタスクの実行を制御する第一のコントローラーと、
前記第一のコントローラーにて動作する１のタスクから生成される１または複数のサブタスクが登録される複数のキューであって、第一のキューと、前記第一のキューよりも優先度の低い第二のキューとを含む複数のキューと、
前記複数のキューに登録されたサブタスクを取得し、スレッドを作成して当該取得したサブタスクを実行させる第二のコントローラーと、
を備える情報処理システムであって、
前記複数のキューそれぞれは、自身に登録されたサブタスクのうち同時に実行されるサブタスクの数の上限値が定義され、
前記第二のコントローラーは、
前記情報処理システムにて同時に実行されるサブタスクの数に対する閾値を管理し、
前記情報処理システムにて実行中のサブタスクの数が前記閾値を超えない場合には、前記複数のキューのいずれかからサブタスクを取得し、スレッドを新たに作成して当該取得したサブタスクを実行させ、
前記情報処理システムにて実行中のサブタスクの数が前記閾値を超える場合には、スレッドを新たに作成せず、
前記第一のキューに登録されたサブタスクのうち実行中のサブタスクの数が前記第一のキューに対して定義された上限値よりも少ない場合、前記情報処理システムにて実行中のサブタスクの数が前記閾値を超えているか否かに関わらず、前記第一のキューに登録されているサブタスクを取得し、スレッドを新たに作成して当該取得したサブタスクを実行させることを特徴とする情報処理システム。
【請求項２】
サブタスクは、定義された処理内容に応じて、優先度の異なる前記複数のキューのいずれかに登録されることを特徴とする請求項１に記載の情報処理システム。
【請求項３】
前記複数のキューそれぞれは、登録されたサブタスクのうち実行中のサブタスクの数が管理され、
実行中のサブタスクの数は、サブタスクに対するスレッドが新たに作成された際に増加され、当該スレッドによる当該サブタスクの実行が完了した際に減らされることを特徴とする請求項１または２に記載の情報処理システム。
【請求項４】
前記第二のコントローラーは、スレッドによるサブタスクの実行が完了した際に、前記第一のコントローラーへ実行結果を通知することを特徴とする請求項１乃至３のいずれか一項に記載の情報処理システム。
【請求項５】
前記第二のコントローラーは、前記第一のコントローラーによりタスクがキャンセルされた場合、当該キャンセルされたタスクから生成されたサブタスクにて定義された処理内容を実行することなく、キャンセルである旨を実行結果として当該サブタスクの実行を完了することを特徴とする請求項１乃至４のいずれか一項に記載の情報処理システム。
【請求項６】
前記第二のコントローラーは、当該第二のコントローラーの起動時における前記情報処理システムの機能及び状態に応じて、前記閾値、および、前記複数のキューそれぞれに対する前記上限値を決定することを特徴とする請求項１乃至５のいずれか一項に記載の情報処理システム。
【請求項７】
前記第二のコントローラーは、前記第一のキューに登録されたサブタスクに対する処理を行った後、キューの優先度が高い順に、その他のキューに登録されたサブタスクに対する処理を行うことを特徴とする請求項１乃至６のいずれか一項に記載の情報処理システム。
【請求項８】
複数のタスクの実行を制御する第一のコントローラーと、
前記第一のコントローラーにて動作する１のタスクから生成される１または複数のサブタスクが登録される複数のキューであって、第一のキューと、前記第一のキューよりも優先度の低い第二のキューとを含む複数のキューと、
前記複数のキューに登録されたサブタスクを取得し、スレッドを作成して当該取得したサブタスクを実行させる第二のコントローラーと、
を備える情報処理システムの制御方法であって、
前記複数のキューそれぞれは、自身に登録されたサブタスクのうち同時に実行されるサブタスクの数の上限値が定義され、
前記第二のコントローラーにおいて、
前記情報処理システムにて同時に実行されるサブタスクの数に対する閾値を管理し、
前記情報処理システムにて実行中のサブタスクの数が前記閾値を超えない場合には、前記複数のキューのいずれかからサブタスクを取得し、スレッドを新たに作成して当該取得したサブタスクを実行させ、
前記情報処理システムにて実行中のサブタスクの数が前記閾値を超える場合には、スレッドを新たに作成せず、
前記第一のキューに登録されたサブタスクのうち実行中のサブタスクの数が前記第一のキューに対して定義された上限値よりも少ない場合、前記情報処理システムにて実行中のサブタスクの数が前記閾値を超えているか否かに関わらず、前記第一のキューに登録されているサブタスクを取得し、スレッドを新たに作成して当該取得したサブタスクを実行させることを特徴とする制御方法。
【請求項９】
コンピューターを、
複数のタスクの実行を制御する第一のコントローラーにて動作する１のタスクから生成される１または複数のサブタスクが登録される複数のキューに登録されたサブタスクを取得し、スレッドを作成して当該取得したサブタスクを実行させる第二のコントローラーとして機能させ、
前記複数のキューは、第一のキューと、前記第一のキューよりも優先度の低い第二のキューと、を含み、
前記複数のキューそれぞれは、自身に登録されたサブタスクのうち同時に実行されるサブタスクの数の上限値が定義され、
前記第二のコントローラーは、
前記コンピューターにて同時に実行されるサブタスクの数に対する閾値を管理し、
前記コンピューターにて実行中のサブタスクの数が前記閾値を超えない場合には、前記複数のキューのいずれかからサブタスクを取得し、スレッドを新たに作成して当該取得したサブタスクを実行させ、
前記コンピューターにて実行中のサブタスクの数が前記閾値を超える場合には、スレッドを新たに作成せず、
前記第一のキューに登録されたサブタスクのうち実行中のサブタスクの数が前記第一のキューに対して定義された上限値よりも少ない場合、前記コンピューターにて実行中のサブタスクの数が前記閾値を超えているか否かに関わらず、前記第一のキューに登録されているサブタスクを取得し、スレッドを新たに作成して当該取得したサブタスクを実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理システムおよびその制御方法、並びにプログラムに関する。
【背景技術】
【０００２】
従来、ＰＣなどの情報処理装置において、マルチスレッドを用いた複数タスクの実行処理では、スレッドに対応付けられたキューにタスクをエンキューする際に、キューの長さやタスクの実行時間等に基づき各スレッドの処理が均等になるように制御している。これにより、効率的にタスクの実行を行っていた（例えば、特許文献１参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１３−５４４５１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかし、上記従来技術では、タスクの優先度が高い（緊急に実行したい）場合であっても、タスクはキューの末尾にエンキューされるため、先にエンキューされた優先度の低いタスクが終了しない限り、優先度の高いタスクは実行されないという問題がある。また、空のキューが存在し、その空のキューに対応付けられたスレッドがアイドル状態であっても、その空のキューとは別のキューに蓄積されたタスクはその別のキューに対応付けられたスレッドによりエンキューされるまで実行されない。その結果、非効率な動作となる。
【課題を解決するための手段】
【０００５】
上記課題を解決するために、本願発明は以下の構成を有する。すなわち、情報処理システムであって、複数のタスクの実行を制御する第一のコントローラーと、前記第一のコントローラーにて動作する１のタスクから生成される１または複数のサブタスクが登録される複数のキューであって、第一のキューと、前記第一のキューよりも優先度の低い第二のキューとを含む複数のキューと、前記複数のキューに登録されたサブタスクを取得し、スレッドを作成して当該取得したサブタスクを実行させる第二のコントローラーと、を備え、前記複数のキューそれぞれは、自身に登録されたサブタスクのうち同時に実行されるサブタスクの数の上限値が定義され、前記第二のコントローラーは、前記情報処理システムにて同時に実行されるサブタスクの数に対する閾値を管理し、前記情報処理システムにて実行中のサブタスクの数が前記閾値を超えない場合には、前記複数のキューのいずれかからサブタスクを取得し、スレッドを新たに作成して当該取得したサブタスクを実行させ、前記情報処理システムにて実行中のサブタスクの数が前記閾値を超える場合には、スレッドを新たに作成せず、前記第一のキューに登録されたサブタスクのうち実行中のサブタスクの数が前記第一のキューに対して定義された上限値よりも少ない場合、前記情報処理システムにて実行中のサブタスクの数が前記閾値を超えているか否かに関わらず、前記第一のキューに登録されているサブタスクを取得し、スレッドを新たに作成して当該取得したサブタスクを実行させる。
【発明の効果】
【０００６】
本願発明により、キューを利用してタスクを処理する際に、効率的に処理を行うことが可能となる。
【図面の簡単な説明】
【０００７】
【図１】本願発明に係る管理アプリケーションの機能構成を説明するための図。
【図２】本発明に係るネットワークシステムの構成例を示す図。
【図３】ホストコンピューターのハードウェア構成の例を示す図。
【図４】タスクをエンキューする際の処理のフローチャート。
【図５】タスクの処理クラスのＧｏメソッドの処理のフローチャート。
【図６】サブタスクキューにサブタスク定義データをエンキューする処理のフローチャート。
【図７】サブタスクの実行処理のフローチャート。
【図８Ａ】サブタスクキューからサブタスク定義データをデキューする処理のフローチャート。
【図８Ｂ】サブタスクキューからサブタスク定義データをデキューする処理のフローチャート。
【図９】サブタスクの実行終了通知の処理の流れを示す図。
【図１０】サブタスクを実行するスレッドの処理のフローチャート。
【図１１Ａ】タスクコントローラーが有するメソッドの例を示す図。
【図１１Ｂ】ＴａｓｋＢａｓｅ抽象クラスを継承したクラスインスタンスの例を示す図。
【図１１Ｃ】サブタスク定義データ、およびクラスの記述例を示す図。
【図１１Ｄ】第二の実施形態に係るクラスの記述例を示す図。
【発明を実施するための形態】
【０００８】
以下、本発明を実施するための形態について図面を用いて説明する。
【０００９】
＜第一の実施形態＞
［システム構成］
図２は、本発明に係るネットワークシステムの構成例を示す図である。ホストコンピューター２０１は、情報処理装置であって、ネットワーク２０２に接続された複数のネットワークデバイスを管理するための管理アプリケーションが動作する。画像形成装置２０３〜２０８はそれぞれ、ネットワークデバイスであり、ホストコンピューター２０１が備える管理アプリケーションにより管理される。本願発明に係る管理アプリケーションの動作については後述する。
【００１０】
図３は、ホストコンピューター２０１のハードウェア構成の例を示す図である。ホストコンピューター２０１は、ＣＰＵ３０１、ＲＡＭ３０２、ＲＯＭ３０３、および外部記憶装置３０７を備える。ＣＰＵ３０１は、ＲＯＭ３０３や外部記憶装置３０７に記憶された、或いはネットワーク２０２よりダウンロードしたソフトウェアを実行し、ホストコンピューター２０１が備える各デバイスを総括的に制御する。ＲＡＭ３０２は、揮発性の記憶領域であり、ＣＰＵ３０１の主メモリあるいはワークエリアなどとして機能する。外部記憶装置３０７は、不揮発性の記憶領域であり、ハードディスク（ＨＤ）やソリッドステートドライブ（ＳＳＤ）等から構成される。外部記憶装置３０７は、不揮発性の記憶領域であり、ブートプログラム、オペレーティングシステム、認証サーバおよび認証クライアント等を含む各種アプリケーション、データベースデータ、およびユーザファイル等を記憶する。
【００１１】
更に、ホストコンピューター２０１は、キーボードコントローラー（ＫＢＤＣ）３０４、ビデオコントローラー（ＶＣ）３０５、ディスクコントローラー（ＤＣ）３０６、および通信コントローラー（ＮＩＣ）３０８を備える。キーボードコントローラー３０４は、キーボードやポインティングデバイス（不図示）からの入力情報をＣＰＵ３０１に送る。ビデオコントローラー３０５は、ＬＣＤ（Ｌｉｑｕｉｄ  Ｃｒｙｓｔａｌ  Ｄｉｓｐｌａｙ）等から構成される表示装置の表示を制御する。ディスクコントローラー３０６は、外部記憶装置３０７とのアクセスを制御する。通信コントローラー３０８は、ネットワーク２０２とのインタフェースであり、ホストコンピューター２０１とネットワーク２０２とを接続する。また、上記の外部記憶装置３０７以外の構成要素は、バス３０９を介して、互いに通信可能に接続される。
【００１２】
［管理アプリケーション］
本願発明に係るホストコンピューター２０１が備える管理アプリケーションの機能について説明する。管理アプリケーションは、例えば、ネットワーク２０２に接続された各画像形成装置から以下のような各種情報を取得し、管理する。
【００１３】
（１）一定期間毎に各画像形成装置の状態情報を取得
（２）画像形成装置にエラーが発生した際に画像形成装置から送信されるエラー発生通知を受信し、該画像形成装置の状態情報を取得
（３）一定期間毎に各画像形成装置の消耗品情報を取得
（４）一定期間毎に各画像形成装置の入力情報（用紙の種別と残量）を取得
（５）一定期間毎に各画像形成装置の各種カウンター情報を取得
（６）一定期間毎に各画像形成装置の各種設定値データを取得
（７）指定時刻にネットワークをスキャンし、ネットワーク上の画像形成装置を探索
ここでの一定期間や指定時刻は予め定義されているものとし、また、処理ごとに異なる値が設定されていてもよい。また、管理アプリケーションの機能として、上記にて７つの機能を示したが、これに限定するものではない。また、どの機能を有効にするかは、管理アプリケーションの利用者が自由に選択可能であってよい。
【００１４】
例えば、状態情報の取得機能は、定期的に各画像形成装置に対してその状態情報を取得するための処理を開始する。更に、状態情報の取得機能は、定期的に各画像形成装置に対して、画像形成装置がエラー発生時に管理アプリケーションに対してエラー発生通知を送信するための設定を行う。また、状態情報の取得機能は、画像形成装置からのエラー発生通知を受信すると、該画像形成装置から現在の状態の情報を取得する。
【００１５】
状態情報、消耗品情報、入力情報、および各種カウンター情報は、その情報量が比較的少量であるため、各画像形成装置からのこれら情報の取得は短時間で終了する。各種設定値データはデータ量が多く、その取得には長い時間が必要となる場合が多い。また、状態情報の取得は、画像形成装置のエラーの発生から規定時間内にエラーの発生を利用者に通知する、といった制約が設けられている場合が多い。このため、画像形成装置からのエラー通知を受信した場合、速やかに該画像造形装置より状態情報を取得する必要がある。各種設定値データの取得に関しては、このような時間的制約は設けられていない。つまり、管理アプリケーションが管理する画像形成装置の情報は、その情報の内容に応じて扱う際の特性が異なる。
【００１６】
図１は、本発明に係るホストコンピューター２０１の管理アプリケーションの機能構成を説明するための図である。図１を用いて、本願発明に係るタスク及びサブタスクの制御を説明する。
【００１７】
本願発明において、１のタスクコントローラー１０１は、複数のタスクの実行を制御する。言い換えると、複数のタスクが、１のタスクコントローラー１０１にて動作する。図１では、一例として、タスクコントローラー１０１にて動作する３つのタスク１０３〜１０５を示している。例えば、状態情報の取得、消耗品情報の取得、各種設定値データの取得等が、タスク１０３〜１０５それぞれに相当する。また、１のタスクは、複数のサブタスクに分割される。例えば、管理アプリケーションにおける状態情報の取得処理に関するタスクであれば、各画像形成装置からの状態情報の取得処理や、各画像形成装置へのエラー発生通知設定がそれぞれ、サブタスクとなる。なお、１のタスクから作成されれるサブタスクの数は、タスクの処理内容や対象に応じて異なる。
【００１８】
図１において、サブタスク定義データ１０９〜１１１として示される各要素はそれぞれ、サブタスクの処理内容を定義したデータである。また、サブタスク実行処理１１２〜１１４として示される各要素は、サブタスク定義データで示される処理を実行するためのサブタスク実行処理であり、それぞれ別々のスレッドで実行される。つまり、スレッドの数は、実行中のサブタスク（サブタスク実行処理）の数となる。
【００１９】
また、本願発明において、１のサブタスクコントローラー１０２は、複数のサブタスクキューを管理する。図１では、一例として、３つのサブタスクキュー１０６、１０７、１０８が設けられる。サブタスクキュー１０６、１０７、１０８はそれぞれ、サブタスク定義データを格納する。タスク１０３〜１０５はそれぞれ、複数のサブタスク定義データを作成し、これをサブタスクコントローラー１０２が管理する複数のサブタスクキューのいずれかに追加（エンキュー）する。サブタスク実行処理は、サブタスクキューからサブタスク定義データを取得（デキュー）し、サブタスク定義データに従ってサブタスクを実行する。
【００２０】
図１に示すように、複数のサブタスクキューはそれぞれ、格納されるサブタスク定義データの特徴に応じて使い分けがなされる。サブタスクキュー１０６には、実行の優先順位が高いサブタスク定義データが格納される。例えば、画像形成装置からのエラー通知に伴う状態取得のように、直近に処理する必要があるサブタスク定義データはサブタスクキュー１０６に格納される。サブタスクキュー１０６に格納されたサブタスク定義データは、他のサブタスクキューに格納されたサブタスク定義データよりも優先的にサブタスク実行処理により処理される。サブタスクキュー１０７には、状態情報の取得や消耗品情報の取得等の短時間で処理が終了するサブタスク定義データが格納される。サブタスクキュー１０８には、各種設定データの取得処理等の処理の終了に長時間を要するサブタスク定義データが格納される。そして、サブタスク定義データは、格納された各サブタスクキューの優先度に応じて処理され、ここでは、サブタスクキュー１０６、サブタスクキュー１０７、サブタスクキュー１０８の順に優先的に処理されるものとする。
【００２１】
また、本実施形態では、ホストコンピューター２０１の性能や状態等に応じて、装置全体として動作させるスレッド（サブタスク実行処理）の数の推奨値（閾値）が定義して管理される。また、複数のサブタスクキューそれぞれには、サブタスクキューからデキューされたサブタスク定義データを処理しているスレッド（サブタスク実行処理）が対応付けられる。このサブタスクキューに対応付けられるスレッドの数の範囲（上限値）も定義して管理される。この管理については、フローチャートと併せて後述する。
【００２２】
タスクコントローラー１０１は、各タスクの実行を制御する。タスクコントローラー１０１はタスクの作成／起動／破棄、およびサブタスク定義データを作成したタスクへの対応するサブタスクの終了通知等の処理を行う。サブタスクコントローラー１０２は、サブタスク定義データのサブタスクキューへのエンキュー／デキュー、及びスレッドを作成してサブタスク実行処理を開始する等の処理を行う。本明細書では、タスクコントローラー１０１を「第一のコントローラー」、サブタスクコントローラー１０２を「第二のコントローラー」とも称する。
【００２３】
以下では、各構成要素を代表して、タスク１０３、サブタスク実行処理１１２、およびサブタスク定義データ１０９を用いて説明する。タスクコントローラー１０１とサブタスクコントローラー１０２は相互への参照を保持する。タスクコントローラー１０１とタスク１０３も相互への参照を保持する。サブタスク実行処理１１２は、サブタスクコントローラー１０２への参照を保持する。
【００２４】
また、以下に説明するメソッドの定義やコードの引用では、プログラミング言語としてＣ＃を用いて説明するが、同等の機能が実現できれば他のプログラム言語を用いて実現してもよい。
【００２５】
ここで、タスクコントローラー１０１が備えるメソッドについて、図１１Ａを用いて説明する。
【００２６】
Ｓｔａｒｔメソッド１１０１は、管理アプリケーションがタスクコントローラー１０１にタスクの追加する際に呼び出すメソッドである。Ｓｔａｒｔメソッド１１０１において、第一引数のｔａｓｋＩｄ１１０５はタスクを一意に識別するための文字列である。ｔａｓｋＩｄとしては、例えば、ＵＵＩＤ（Ｕｎｉｖｅｒｓａｌｌｙ  Ｕｎｉｑｕｅ  Ｉｄｅｎｔｉｆｉｅｒ）やＧＵＩＤ（Ｇｌｏｂａｌｌｙ  Ｕｎｉｑｕｅ  Ｉｄｅｎｔｉｆｉｅｒ）が用いられる。第二引数のｃｌａｓｓＮａｍｅ１１０６は、タスクの処理を実装したクラスの名前を示す文字列である。異なる処理（状態取得、カウンター取得等）はそれぞれ、異なるクラス名を持つ。第三引数のｃｏｎｔｅｎｔｓ１１０７は、タスクの詳細を定義した文字列であり、例えば、タスクの詳細を格納するオブジェクトをシリアライズした文字列が用いられる。
【００２７】
Ｅｎｑｕｅｕｅメソッド１１０２は、タスクがサブタスク定義データをサブタスクキューにエンキューする際に呼び出すメソッドである。
【００２８】
ＯｎＳｕｂｔａｓｋＥｎｄメソッド１１０３は、サブタスク定義データに対する、サブタスク実行処理による処理が終了した際に、サブタスク実行処理がサブタスクコントローラー１０２経由で呼び出すメソッドである。
【００２９】
Ｒｅｍｏｖｅメソッド１１０４は、タスクが処理の終了時に呼び出すメソッドである。Ｒｅｍｏｖｅメソッドが呼び出されると、タスクコントローラー１０１は、保持しているタスクへの参照をタスク管理マップから削除する。
【００３０】
［処理フロー］
以下、本願発明に係る処理の流れについて説明する。なお、以下に示す各処理は、ホストコンピューター２０１のＣＰＵ３０１が、ＲＯＭ３０３等の記憶部に格納されたプログラムを読み出して実行することにより実現される。
【００３１】
（タスクの追加）
図４は、ホストコンピューター２０１が備える管理アプリケーションがタスクコントローラー１０１にタスクを追加する際の処理の流れを示すフローチャートである。
【００３２】
管理アプリケーションがタスクコントローラー１０１にタスクの追加を依頼する場合、図１１Ａに示す、タスクコントローラー１０１のＳｔａｒｔメソッド１１０１を呼び出す。図４のフローチャートはこのＳｔａｒｔメソッド１１０１の処理の流れを示す。
【００３３】
Ｓｔａｒｔメソッド１１０１が呼び出されると、Ｓ４０１にて、タスクコントローラー１０１は、引数として渡されたｃｌａｓｓＮａｍｅ１１０６を用いて、タスクの実行を実装したクラスのインスタンス（ここでは、タスク１０３とする）を作成する。ここで作成されるクラスインスタンスは、例えば、画像形成装置から状態情報を取得するタスクであったり、画像形成装置から各種設定値データを取得するタスクであったりする。異なるタスクに対してそれぞれ異なるクラスのインスタンスが作成される。更に、タスクコントローラー１０１は、作成したタスク１０３にタスクコントローラー１０１への参照を設定する。
【００３４】
Ｓ４０２にて、タスクコントローラー１０１は、タスク管理マップ（不図示）に、引数として渡されたｔａｓｋＩｄ１１０５をキーとしてＳ４０１で作成したタスク１０３への参照を追加する。タスク管理マップとは、実行中のタスクのｔａｓｋＩｄをキーとし、タスクへの参照を値として対応付けたマップ（辞書）であり、タスクコントローラー１０１により管理される。タスク管理マップは、ＲＡＭ３０２内に保持される。
【００３５】
Ｓ４０３にて、タスクコントローラー１０１は、Ｓ４０１で作成したタスク１０３の開始メソッドを呼び出す。そして、本処理フローを終了する。
【００３６】
タスクコントローラー１０１がＳ４０１で作成するタスク１０３は、図１１Ｂに示すような、ＴａｓｋＢａｓｅ抽象クラスを継承したクラスのインスタンスである。なお、「継承」とは、継承元の機能を引き継ぎ、新たなクラスを生成することを意味する。つまり、ここでは、タスク１０３は、ＴａｓｋＢａｓｅ抽象クラスの機能を引き継いで新たなクラスとして生成されている。承継については、Ｃ＃などのオブジェクト指向型の言語の分野にて周知であるため、ここでは詳細な説明を省略する。
【００３７】
ＴａｓｋＢａｓｅ抽象クラスを継承したタスク１０３は、ＷｉｔｈＣｏｎｔｒｏｌｌｅｒメソッド１１１１、Ｇｏメソッド１１１２、ＯｎＳｕｂｔａｓｋＥｎｄメソッド１１１３、およびＥｎｑｕｅｕｅメソッド１１１４を実装する。ＷｉｔｈＣｏｎｔｒｏｌｌｅｒメソッド１１１１は、タスクコントローラー１０１への参照の設定を行うためのメソッドである。Ｇｏメソッド１１１２は、タスクを実行するためのメソッドである。ＯｎＳｕｂｔａｓｋＥｎｄメソッド１１１３は、サブタスクの実行終了通知を受け取るためのメソッドである。Ｅｎｑｕｅｕｅメソッド１１１４は、サブタスク定義データ１０９をサブタスクキューへエンキューするためのメソッドである。
【００３８】
タスクコントローラー１０１は、Ｓ４０１にて、作成したタスク１０３からタスクコントローラー１０１への参照の設定を、ＷｉｔｈＣｏｎｔｒｏｌｌｅｒメソッド１１１１を呼び出すことにより行う。また、タスクコントローラー１０１は、Ｓ４０３の開始メソッドの呼び出しを、Ｇｏメソッド１１１２を呼び出すことにより実行する。
【００３９】
（タスクの開始）
図５は、ＴａｓｋＢａｓｅ抽象クラスを継承したタスク１０３の、Ｇｏメソッド１１１２の処理の流れを示すフローチャートである。
【００４０】
Ｓ５０１にて、タスク１０３は、Ｇｏメソッド１１１２の引数であるｃｏｎｔｅｎｔｓをデシリアライズ（変換）し、タスクの詳細を含むオブジェクト（タスク詳細情報）を作成する。例えば、ｃｏｎｔｅｎｔｓとして管理アプリケーションの状態情報取得タスクが指定された場合、タスク詳細情報は、状態情報の取得対象となる画像記憶装置のネットワークアドレスのリストである。
【００４１】
Ｓ５０２にて、タスク１０３は、Ｓ５０１で作成したタスク詳細情報から、タスクを複数のサブタスクに分割し、各サブタスクを表現するサブタスク定義データ１０９を作成する。例えば、上述したような状態情報取得タスクの場合、サブタスクは画像形成装置ごとの状態取得であり、サブタスク定義データには取得対象の画像形成装置それぞれのネットワークアドレスが指定される。
【００４２】
更に、タスク１０３は、生成されたサブタスク定義データの特性に応じて、サブタスク定義データを、サブタスクコントローラー１０２が備える複数のサブタスクキューのうちのいずれかにエンキューする。タスク１０３は、サブタスク定義データ１０９をサブタスクキューへエンキューするために、ＴａｓｋＢａｓｅクラスのＥｎｑｕｅｕｅメソッド１１１４を呼び出す。基底クラスＴａｓｋＢａｓｅのＥｎｑｕｅｕｅメソッド１１１４の処理は、図１１Ｂで示すように、まず、タスクコントローラー１０１のＥｎｑｕｅｕｅメソッド１１１５を呼び出す。タスクコントローラー１０１のＥｎｑｕｅｕｅメソッド１１１５の処理では、指定されたサブタスクキューへのサブタスク定義データのエンキューに成功した場合は真を、失敗した場合は偽が返される。基底クラスＴａｓｋＢａｓｅは、サブタスク定義データのサブタスクキューへのエンキューに成功した場合、クラス内部に保持するサブタスクカウンターの値を１増加させる（１１１６）。このサブタスクカウンターの値は、タスク１０３がサブタスクキューにエンキューしたサブタスク定義データのうち、現在サブタスクキュー内にあるサブタスク定義データの数と、サブタスク実行処理により実行中のサブタスクの数の和である。
【００４３】
図１１Ｃ（ａ）は、サブタスク定義データ１０９の構造例を示す。ＴａｓｋＩｄ１１２１は、図４のタスクの追加処理にて渡されたＴａｓｋＩｄ（Ｓｔａｒｔメソッド１１０１に渡されたｔａｓｋＩｄ１１０５）である。ＳｕｂｔａｓｋＩｄ１１２２は、各サブタスクを一意に識別するための文字列である。ＣｌａｓｓＮａｍｅ１１２３は、サブタスクを実行するクラスの名前である。Ｃｏｎｔｅｎｔｓ１１２４は、各サブタスクの処理の詳細を含む文字列である。ＳｕｂｔａｓｋＩｄ１１２２、ＣｌａｓｓＮａｍｅ１１２３、およびＣｏｎｔｅｎｔｓ１１２４は共に、タスク１０３により生成される。
【００４４】
サブタスクキューはそれぞれ、自身を一意に識別するための名前、自身にエンキューされたサブタスクであって現在サブタスク実行処理により実行中のサブタスクの数、および、自身に対応する同時に実行可能なサブタスクの数の上限値の情報を有する。また、サブタスクコントローラー１０２は、全体として同時に実行可能なサブタスクの合計数の閾値を保持している。各サブタスクキューのサブタスクの同時実行数の上限値と、サブタスクコントローラー１０２が管理する全体としての合計数の閾値とには、次の関係がある。
【００４５】
１．各サブタスクキューの上限数の合計  ＞  合計数の閾値
２．優先度高以外のサブタスクキューの上限数の合計  ≦  合計数の閾値
本実施形態において、各サブタスクキューの上限数および合計数の閾値は、ホストコンピューター２０１の性能や状態に基づき、サブタスクコントローラー１０２の作成時（起動時）にサブタスクコントローラー１０２が決定する。
【００４６】
（サブタスク定義データのエンキュー）
図６は、図５のＳ５０２にて要求されたエンキュー要求に従って、サブタスクコントローラー１０２が指定されたサブタスクキューにサブタスク定義データをエンキューする処理を示すフローチャートである。このとき、Ｅｎｑｕｅｕｅメソッド１１１４が呼び出され、サブタスク定義データとエンキュー先となるサブタスクキューの名前が引数として渡される。
【００４７】
Ｓ６０１にて、サブタスクコントローラー１０２は、与えられたサブタスクキューの名前を持つサブタスクキューをサブタスクキューの一覧から取得する。
【００４８】
Ｓ６０２にて、サブタスクコントローラー１０２は、与えられたサブタスク定義データのＴａｓｋＩｄとＳｕｂｔａｓｋＩｄの組み合わせと同じ組み合わせを持つサブタスク定義データが、Ｓ６０１にて取得したサブタスクキュー内に存在するか否かを確認する。確認の結果、同じ組み合わせのサブタスク定義データが、Ｓ６０１で取得したサブタスクキュー内に存在する場合（Ｓ６０２にてＹＥＳ）、Ｓ６０９にて、サブタスクコントローラー１０２は偽を返す。そして、本処理フローを終了する。ここで、偽を返すことは、指定されたサブタスク定義データがサブタスクキューへエンキューされなかったことを意味する。サブタスクキュー内に同じＴａｓｋＩｄとＳｕｂｔａｓｋＩｄの組み合わせを持つサブタスク定義データが存在しない場合（Ｓ６０２にてＮＯ）、Ｓ６０３へ遷移する。
【００４９】
Ｓ６０３にて、サブタスクコントローラー１０２は、取得したサブタスクキューに、与えられたサブタスク定義データをエンキューする。
【００５０】
例えば、管理アプリケーションの状態情報取得タスクが、一定期間毎に管理対象の画像形成装置から状態情報を取得する場合、期間内に取得処理が終了しない場合はサブタスクキュー内に、前回に追加したサブタスク定義データが存在する可能性がある。ＩＤの組み合わせの重複判定（Ｓ６０２）により、同じ処理をするサブタスク定義データのエンキューを抑止することができる。
【００５１】
以降の処理で、サブタスクコントローラー１０２は、サブタスク実行用のスレッドを開始するか否かの判定を行う。
【００５２】
Ｓ６０４にて、サブタスクコントローラー１０２は、取得したサブタスクキューが優先度高のサブタスクキューであるか否かを判定する。ここでの優先度高のサブタスクキューとは、例えば、図１のサブタスクキュー１０６が該当する。判定の結果、優先度高のサブタスクキューの場合には（Ｓ６０４にてＹＥＳ）Ｓ６０５に遷移し、そうでない場合には（Ｓ６０４にてＮＯ）Ｓ６０６に遷移する。
【００５３】
Ｓ６０５にて、サブタスクコントローラー１０２は、優先度高のサブタスクキューの現在実行中のサブタスクの数が、そのサブタスクキューに対して定義された上限数以下であるか否かを判定する。現在実行中のサブタスクの数が上限を超えている場合（Ｓ６０５にてＮＯ）、Ｓ６０８にてサブタスクコントローラー１０２は、真を返す。そして、本処理フローを終了する。ここで、真を返すことは、指定されたタスク定義データがエンキューされたことを意味する。一方、上限数以下である場合には（Ｓ６０５にてＹＥＳ）Ｓ６０７に遷移する。
【００５４】
Ｓ６０６にて、サブタスクコントローラー１０２は、実行中のサブタスク実行処理（スレッド）の総数がスレッドの合計数の閾値以下であるか否かを判定する。判定の結果、閾値を超えている場合には（Ｓ６０６にてＮＯ）Ｓ６０８にて、サブタスクコントローラー１０２は、真を返す。そして、本処理フローを終了する。一方、閾値以下である場合には（Ｓ６０６にてＹＥＳ）、Ｓ６０７に遷移する。
【００５５】
Ｓ６０７にて、サブタスクコントローラー１０２は、サブタスク実行用のスレッドを作成し、サブタスク実行処理１１２を開始する。その後、Ｓ６０８にて、サブタスクコントローラー１０２は、真を返す。そして、本処理フローを終了する。
【００５６】
（サブタスク実行処理）
図７は、個別のスレッドで実行されるサブタスクの実行処理の流れを示すフローチャートである。図６のＳ６０７にて、サブタスクコントローラー１０２は、スレッドを作成し、サブタスクの処理を開始する。この処理の実行主体はサブタスクコントローラー１０２である。
【００５７】
Ｓ７０１にて、サブタスクコントローラー１０２は、サブタスクキューからサブタスク定義データをデキューする処理を呼び出す。ここでの処理の詳細については、図８Ａおよび図８Ｂを用いて後述する。
【００５８】
Ｓ７０２にて、サブタスクコントローラー１０２は、サブタスク定義データがデキューできたか否かを判定する。サブタスク定義がデキューできなかった場合は（Ｓ７０２にてＮＯ）、本処理フローを終了し、スレッドを終了する。サブタスク定義データがデキューできた場合（Ｓ７０２にてＹＥＳ）、Ｓ７０３へ遷移する。
【００５９】
Ｓ７０３にて、サブタスクコントローラー１０２は、サブタスク定義データ１０９内のＣｌａｓｓＮａｍｅ属性（図１１Ｃ（ａ）のＣｌａｓｓＮａｍｅ１１２３）からサブタスクを実行するためのクラスのインスタンスを作成する。ここで作成されるサブタスクを実行するためのクラスインスタンスは、図１１Ｃ（ｂ）に示すように、抽象クラスを継承したクラスである。図１１Ｃ（ｂ）に示すＧｏメソッド１１２５は、サブタスク定義データを引数に持ち、サブタスク定義データに記載された処理内容に従ってサブタスクを実行する処理である。
【００６０】
Ｓ７０４にて、サブタスクコントローラー１０２は、Ｓ７０３で作成したサブタスクを実行するためのクラスインスタンスのＧｏメソッド１１２５を呼び出し、メソッドの戻り値である実行結果（図１１Ｃ（ｃ））を取得する。
【００６１】
Ｓ７０５にて、サブタスクコントローラー１０２は、Ｓ７０４にて取得した実行結果を引数にしてサブタスクコントローラー１０２のＯｎＳｕｂｔａｓｋＥｎｄメソッド１１０３を呼び出す。その後、サブタスクコントローラー１０２は、Ｓ７０１の処理に戻る。このサブタスク終了時処理を含むサブタスクの終了時の処理全体の詳細に関しては図９を用いて後述する。
【００６２】
図１１Ｃ（ｃ）は、サブタスクの実行結果を格納するクラスの定義を示す。実行結果において、ＴａｓｋＩｄ１１２６とＳｕｂｔａｓｋＩｄ１１２７は、サブタスク定義データ１０９に含まれる同名の属性の値が格納される。Ｓｔａｔｕｓ１１２８は、実行結果の状態（成功、エラー終了、例外による終了）を示す。Ｒｅｓｕｌｔ１１２９は、結果の詳細を含むｏｂｊｅｃｔクラスを継承したクラスのインスタンスへの参照である。
【００６３】
（サブタスク定義データのデキュー）
図８Ａは、図７のＳ７０１で呼び出されるサブタスクキューからサブタスク定義データをデキューする処理の流れを示すフローチャートである。
【００６４】
Ｓ８０１にて、サブタスクコントローラー１０２は、優先度高のサブタスクキュー１０６からサブタスク定義データをデキューする処理を呼び出す。ここでの処理の詳細は、図８Ｂを用いて後述する。
【００６５】
Ｓ８０２にて、サブタスクコントローラー１０２は、優先度高のサブタスクキュー１０６からのサブタスク定義データのデキューの可否を判定する。サブタスク定義データをデキューできた場合は（Ｓ８０２にてＹＥＳ）、Ｓ８０８にて、サブタスクコントローラー１０２は、デキューしたサブタスク定義データを返す。そして、本処理フローを終了する。デキューできなかった場合（Ｓ８０２にてＮＯ）、Ｓ８０３へ遷移する。ここで、デキューできない場合とは、優先度高のサブタスクキューにサブタスク定義が存在しない場合、もしくは、優先度高のサブタスクキューの現在実行中のサブタスクの数がその上限値に達している場合が該当する。
【００６６】
Ｓ８０３にて、サブタスクコントローラー１０２は、現在のサブタスクの実行数（各サブタスクキュー内の現在実行中のサブタスクの数の合計）と、装置全体として実行するサブタスクの合計数の閾値とを比較する。比較の結果、実行数が閾値と等しいか大きい場合（Ｓ８０３にてＮＯ）、Ｓ８０９にて、サブタスクコントローラー１０２は、ｎｕｌｌを返す。そして、本処理フローを終了する。これは、この処理を呼び出したサブタスク実行処理１１２が処理を終了し、処理を実行していたスレッドが終了することを意味する。合計数が閾値よりも少ない場合（Ｓ８０３にてＹＥＳ）、Ｓ８０４に遷移する。
【００６７】
Ｓ８０４以降の処理にて、サブタスクコントローラー１０２は、優先度高以外のサブタスクキューから、優先度に従って、サブタスク定義データをデキューする処理を行う。
【００６８】
Ｓ８０４にて、サブタスクコントローラー１０２は、優先度高以外のサブタタスクキューから優先度の高い順にデキュー処理の対象とする。図１の例では、まず、サブタスクキュー１０７をデキュー処理の対象とし、サブタスクキュー１０７への処理が完了した後、サブタスクキュー１０８をデキュー処理の対象とする。
【００６９】
Ｓ８０５にて、サブタスクコントローラー１０２は、全てのサブタスクキューへの処理が終了したか否かを判定する。全てのサブタスクキューに対する処理が完了した場合（Ｓ８０５にてＹＥＳ）、Ｓ８０９にて、サブタスクコントローラー１０２は、ｎｕｌｌを返す。そして、本処理フローを終了する。全てのサブタスクキューに対する処理が完了していない場合（Ｓ８０５にてＮＯ）、Ｓ８０６へ遷移する。
【００７０】
Ｓ８０６にて、サブタスクコントローラー１０２は、処理対象のサブタスクキューからサブタスク定義データをデキューする処理を行う。ここでの処理は、Ｓ８０１の処理と同様であり、詳細は図８Ｂを用いて説明する。
【００７１】
Ｓ８０７にて、サブタスクコントローラー１０２は、サブタスク定義データのデキューの可否を判定する。デキューできた場合は（Ｓ８０７にてＹＥＳ）、Ｓ８０８にて、サブタスクコントローラー１０２は、デキューしたサブタスク定義データを返す。そして、本処理フローを終了する。デキューできなかった場合は（Ｓ８０７にてＮＯ）、Ｓ８０４に戻り、サブタスクコントローラー１０２は、優先度が次のサブタスクキューに対して同様の処理を繰り返す。
【００７２】
図８Ｂは、図８ＡのＳ８０１とＳ８０６にて呼び出される、サブタスクキューからタスク定義データをデキューする処理の流れを示すフローチャートである。
【００７３】
Ｓ８１０にて、サブタスクコントローラー１０２は、処理対象のサブタスクキュー内にサブタスク定義データが存在するか否かを判定する。サブタスク定義データが存在しない、即ち処理対象のサブタスクキューが空の場合は（Ｓ８１０にてＹＥＳ）、Ｓ８１５にて、サブタスクコントローラー１０２は、ｎｕｌｌを返す。そして、本処理フローを終了する。サブタスクキュー内にサブタスク定義データが存在する場合は（Ｓ８１０にてＮＯ）、Ｓ８１１へ遷移する。
【００７４】
Ｓ８１１にて、サブタスクコントローラー１０２は、処理対象のサブタスクキューの現在のサブタスクの実行数とその上限値とを比較する。実行数が上限値と等しいあるいは大きい場合は（Ｓ８１１にてＮＯ）、Ｓ８１５にて、サブタスクコントローラー１０２は、ｎｕｌｌを返す。そして、本処理フローを終了する。実行数が上限値よりも小さい場合（Ｓ８１１にてＹＥＳ）、Ｓ８１２へ遷移する。
【００７５】
Ｓ８１２にて、サブタスクコントローラー１０２は、処理対象のサブタスクキューからサブタスク定義データをデキューする。
【００７６】
Ｓ８１３にて、サブタスクコントローラー１０２は、現在のサブタスクの実行数を１増加（カウント）する。
【００７７】
Ｓ８１４にて、サブタスクコントローラー１０２は、デキューしたサブタスク定義データを返す。そして、本処理フローを終了する。
【００７８】
以上、優先度高のサブタスクキューにエンキューされたサブタスク定義データは、実行中のサブタスク数が閾値を超えた場合でも、優先度高のサブタスクキューに定義された上限数を超えていなければ、スレッドを作成して実行を開始させる。一方、その他のサブタスクキューにエンキューされたサブタスク定義データは、実行中のタスク数が閾値を超えた場合にはスレッドを作成しない。これにより、スレッドによる処理数を制御しつつ、効率的にサブタスクを処理することが可能となる。
【００７９】
［サブタスクの実行終了の通知］
図９は、サブタスクの実行処理しているスレッドから、サブタスクの実行終了通知が、そのサブタスク定義データを作成したタスクに通知されるまでの流れを示すシーケンス図である。図９において右端のＳｕｂｔａｓｋはサブタスク実行処理１１２であり、サブタスクコントローラー１０２の処理であるが、説明を解りやすくするために、サブタスクコントローラー１０２の列とは別の列に記載している。
【００８０】
図７のＳ７０５にて、サブタスクコントローラー１０２が、サブタスク終了処理ＯｎＳｕｂｔａｓｋＥｎｄ（Ｓ９０１）を呼び出す。ＯｎＳｕｂｔａｓｋＥｎｄ（Ｓ９０１）には、サブタスクの実行結果と当該サブタスクの定義データが格納されていたサブタスクキューの名前が渡される。
【００８１】
Ｓ９０１にて、サブタスクコントローラー１０２は、渡されたサブタスクキューの名前を持つサブタスクキューの現在のサブタスクの実行数を１減算する。その後、サブタスクコントローラー１０２は、タスクコントローラー１０１のサブタスク終了処理ＯｎＳｕｂｔａｓｋＥｎｄ（Ｓ９０２）を呼び出す。サブタスク終了処理ＯｎＳｕｂｔａｓｋＥｎｄ（Ｓ９０２）には、サブタスクの実行結果が渡される。
【００８２】
Ｓ９０２にて、タスクコントローラー１０１は、渡されたサブタスク実行結果内のＳｕｂｔａｓｋＩｄ１１２７をキーにして、タスク管理マップからタスク１０３への参照を取得する。次にタスクコントローラー１０１は、取得したタスク１０３のタスク終了処理ＯｎＳｕｂｔａｓｋＥｎｄ（Ｓ９０３）を呼び出す。タスク終了処理ＯｎＳｕｂｔａｓｋＥｎｄ（Ｓ９０３）では、タスク１０３の基底クラスであるＴａｓｋＢａｓｅ抽象クラスのＯｎＳｕｂｔａｓｋＥｎｄメソッドが呼び出される（図１１ＢのＯｎＳｕｂｔａｓｋＥｎｄメソッド１１１３参照）。
【００８３】
タスク１０３は、図１１Ｂの１１１７に示すように、自身が保持しているサブタスクカウンターの値を１減算し、タスク１０３が実装しているＴａｓｋＢａｓｅクラスの抽象メソッドＯｎＳｕｂｔａｓｋＥｎｄメソッド（Ｓ９０４）を呼び出す。図１１Ｂの１１１７に示すように、このＯｎＳｕｂｔａｓｋＥｎｄメソッド（Ｓ９０４）はサブタスクの実行結果と論理値を引数とする。第２引数である論理値には、サブタスクカウンターの値を１減算した結果が０か否かが渡される。つまり、減算した結果が０である場合には理論値として真が渡され、０でない場合には偽が渡される。この論理値が真である場合、タスク１０３がサブタスクキューに追加した全てのサブタスク定義の実行が終了したことを意味する。
【００８４】
タスク１０３は、サブタスク終了処理ＯｎＳｕｂｔａｓｋＥｎｄメソッド（Ｓ９０４）にて、サブタスクの実行結果に基づき適当な処理を行う。その後、Ｓ９０５にて、タスク１０３の実行が完了した場合は真を、タスク１０３の実行が完了していない場合は偽をタスクコントローラー１０１に返す。ここで真が返された場合は、タスクコントローラー１０１は、タスク管理マップからタスク１０３を削除する。つまり、図１１Ａに示すＲｅｍｏｖｅメソッド１１０４が呼び出され、タスクコントローラー１０１は、図４のＳ４０２にて追加したｔａｓｋＩｄとタスク１０３への参照をタスク管理マップから削除する。なお、Ｓ９０２及びＳ９０１の処理は、処理結果を呼び出し側に返さない（返り値は無し）。
【００８５】
以上、本実施形態により、タスクから生成された複数のサブタスクを複数のサブタスクキューを用いて処理する際に、効率的に処理を行うことが可能となる。
【００８６】
＜第二の実施形態＞
本願発明に係る第二の実施形態について説明する。第二の実施形態における全体の構成は第一の実施形態と同じであるため、詳細な説明は省略する。また、以下、第一の実施形態と同じ構成物、同じステップについては同じ符号を用いることとする。
【００８７】
第二の実施形態は、第一の実施形態のタスクコントローラー１０１に、実行中のタスクを停止する手段を追加する。
【００８８】
タスクコントローラー１０１に、図１１Ｄ（ａ）に示すような、実行中のタスクを停止（キャンセル）するためのＣａｎｃｅｌメソッド１１３１と、実行中のタスクが停止を指示されたか否かを返すためのＩｓＣａｎｃｅｌｉｎｇメソッド１１３２を追加する。
【００８９】
ここで、Ｃａｎｃｅｌメソッド１１３１、およびＩｓＣａｎｃｅｌｉｎｇメソッド１１３２の引数であるｔａｓｋＩｄは、Ｓｔａｒｔメソッド１１０１の第１引数で指定した、タスクを一意に識別するための文字列である。実行中のタスクのキャンセル状態の情報を格納するために、図１１Ｄ（ｂ）に示すようなクラスの構成とする。図１１Ｄ（ｂ）に示すように、タスク管理マップのｔａｓｋＩｄをキーにして格納される実行中のタスクの情報は、タスクへの参照（Ｔａｓｋ１１３３）と実行状態（Ｓｔａｔｕｓ１１３４）を含む。
【００９０】
タスクコントローラー１０１は、Ｓｔａｒｔメソッド１１０１の呼び出し時にタスクをタスク管理マップへ登録する際、タスクの実行状態としてＳｔａｔｕｓ１１３４に“Ｒｕｎｎｉｎｇ”を設定する。また、タスクコントローラー１０１は、図１１Ｄ（ａ）に示すＣａｎｃｅｌメソッド１１３１が呼び出されると、引数として指定されたｔａｓｋＩｄをキーにしてタスク管理マップから実行中のタスクに関する情報を取り出す。そして、タスクコントローラー１０１は、そのタスクのＳｔａｔｕｓ１１３４を“Ｃａｎｃｅｌｉｎｇ”に変更する。Ｓｔａｔｕｓ１１３４が取りうる値は、１１３５にて定義されている。
【００９１】
タスクコントローラー１０１は、図１１Ｄ（ａ）に示すＩｓＣａｎｃｅｌｉｎｇメソッド１１３２が呼び出されると、引数として指定されたｔａｓｋＩｄをキーにしてタスク管理マップから実行中のタスクに関する情報を取り出す。そして、タスクコントローラー１０１は、Ｓｔａｔｕｓ１１３４が“Ｃａｎｃｅｌｉｎｇ”であるか否かを返す。Ｓｔａｔｕｓ１１３４が“Ｃａｎｃｅｌｉｎｇ”である場合には真が返され、Ｓｔａｔｕｓ１１３４が“Ｒｕｎｎｉｎｇ”である場合には偽が返される。
【００９２】
また、図１１Ｃ（ｃ）に示すサブタスク実行結果を格納するクラスＳｕｂｔａｓｋＲｅｓｕｌｔの実行結果の状態を示す属性（Ｓｔａｔｕｓ１１２８）の取り得る値として、成功、エラー終了、例外による終了に加えて、キャンセルを追加する。
【００９３】
（サブタスク実行処理）
図１０は、タスクの実行のキャンセルを実現するために拡張された、図７の個別のスレッドで実行されるサブタスク実行処理１１２の処理の流れを示すフローチャートである。以下、図７と異なる部分のみを説明する。
【００９４】
サブタスクキューからサブタスクがデキューできた場合（Ｓ７０２にてＹＥＳ）、Ｓ１００１にて、サブタスクコントローラー１０２は、Ｓ７０１でサブタスクキューから取得したサブタスク定義データを作成したタスクの状態がキャンセルであるか否かを判定する。判定は、タスクコントローラー１０１のＩｓＣａｎｃｅｌｉｎｇメソッド１１３２を呼び出すことにより行う。判定の結果、タスクの状態がキャンセルでない場合（Ｓ１００１にてＮＯ）、Ｓ７０３に遷移し、サブタスクコントローラー１０２は、サブタスクの実行を継続する。タスクの状態がキャンセルの場合（Ｓ１００１にてＹＥＳ）、Ｓ１００２に遷移する。
【００９５】
Ｓ１００２にて、サブタスクコントローラー１０２は、タスクの実行結果の状態がキャンセルである実行結果を作成する。その後、Ｓ７０５に遷移し、サブタスクコントローラー１０２は、Ｓ１００２にて作成した実行結果を渡す。この処理により、キャンセルされたタスクがエンキューしたサブタスク定義データは、サブタスクキューよりデキューされた後、そのサブタスク定義データ内にて定義された処理は実行されることなく実行結果（キャンセル）のみが通知される。ここでの通知の流れは、図９に示した通りである。
【００９６】
以上、本実施形態により、第一の実施形態の効果に加え、キャンセルされたタスクによりエンキューされたサブタスク（サブタスク定義データ）は実行されることなく、処理を効率的に進めることができる。
【００９７】
＜その他の実施形態＞
本発明は、上述の実施形態の１以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピューターにおける１つ以上のプロセッサーがプログラムを読出し実行する処理でも実現可能である。また、１以上の機能を実現する回路（例えば、ＡＳＩＣ）によっても実現可能である。
【符号の説明】
【００９８】
１０１…タスクコントローラー、１０２…サブタスクコントローラー、１０３…タスク、１０６…サブタスクキュー、２０１…ホストコンピューター 
【図１】
0006532385.tif 000002
【図２】
0006532385.tif 000003
【図３】
0006532385.tif 000004
【図４】
0006532385.tif 000005
【図５】
0006532385.tif 000006
【図６】
0006532385.tif 000007
【図７】
0006532385.tif 000008
【図８Ａ】
0006532385.tif 000009
【図８Ｂ】
0006532385.tif 000010
【図９】
0006532385.tif 000011
【図１０】
0006532385.tif 000012
【図１１Ａ】
0006532385.tif 000013
【図１１Ｂ】
0006532385.tif 000014
【図１１Ｃ】
0006532385.tif 000015
【図１１Ｄ】
0006532385.tif 000016