以下、図面を参照し、本発明を実施するための最良の形態について説明する。本実施の形態では、最初に処理の概要を説明し、その後、処理の詳細な説明を行い、ユーザインタフェースについて説明する。また、電子機器をMFP(Multi Function Printer)と記すことにする。なお、ジョブを表示するのは、MFPに限らず、MFPと接続されたパソコンであっても良い。
最初に処理の概要について説明する。本実施の形態は、ジョブに関する内容が多くを占めるので、まずジョブに対する操作とジョブの状態について説明する。ジョブに対する操作には、「ジョブの中止」と、「ジョブの中断」と、「ジョブの再実行」と、「ジョブ情報の編集」と、「ジョブを実行する機器の変更」とがある。
「ジョブの中止」とは、ジョブの実行を取り止める操作である。この「ジョブの中止」は、ジョブの状態が「実行中」、「エラー発生中」、「待機中」、「中断中」であるジョブに対して行うことができる。中止されたジョブは、それ以降実行されることはない。
「ジョブの中断」とは、ジョブの実行を一時的に止める操作である。この「ジョブの中断」は、ジョブの状態が「実行中」もしくは「待機中」であるジョブに対して行うことができる。
「ジョブの再実行」とは、「エラー発生中」、「中断中」の状態のジョブを再び実行する操作である。再実行時に他のジョブが実行されていて、再実行されたジョブをすぐに実行できない場合、そのジョブの状態は「待機中」となる。
「ジョブ情報の編集」とは、ジョブを実行する時の条件を変更する操作である。例えばFAX送信の宛先を別の宛先に変更する操作などが、ジョブ情報の編集にあたる。ジョブ情報の編集は、ジョブの状態が「エラー発生中」、「待機中」、「中断中」であるジョブに対して行うことができる。
「ジョブを実行する機器の変更」とは、ジョブを実行する機器を変更する操作である。例えば、2台のMFPがあり、現在印刷しているMFPにかえて、もう1つのMFPで印刷を実行するような操作がジョブを実行する機器の変更にあたる。
次に、ジョブの状態について説明する。ジョブの状態には、「実行中」と、「待機中」と、「エラー発生中」と、「中断中」と、「完了」と、「中止」とがある。
「実行中」とは、ジョブが実行されている状態である。「待機中」とは、ジョブが実行されるのを待っている状態である。この状態において、実行の順番が回ってくると、ジョブの状態は「実行中」になる。「エラー発生中」とは、ジョブの実行中に何らかのエラーが発生し、ジョブの実行ができなくなっている状態である。この状態において、エラーが取り除かれるとジョブが再開され、そのジョブの状態は「実行中」になる。
「中断中」とは、ユーザからの操作によりジョブの実行が一時的に止まっている状態である。「完了」とは、ジョブが正常に終了した状態である。「中止」とは、ユーザからの操作でジョブの実行が取り止められた状態である。
次に、図6を用いてジョブの状態遷移について説明する。図6には、状態とイベントが示されており、この図はそれらイベントによる状態遷移を示す図である。イベントには、ジョブの実行、ジョブの完了、再実行、中断、エラー発生、中止の6つある。このうち、ジョブの実行と、ジョブの完了と、エラー発生は、内部イベントである。
基本的に、イベントが中止の場合、ジョブの状態が何であってもジョブの状態は中止605に遷移し、そのままジョブが終了するだけとなる。またイベントが再実行の場合、ジョブの状態が何であってもジョブの状態は待機中601に遷移する。
通常、ジョブの状態は待機中601から、実行中602、そして完了603と遷移する。状態が待機中601のときは、ジョブの実行により実行中602に状態が遷移する。また、イベントが中断のときは、状態が中断中604に遷移する。
状態が実行中602のときは、中断、エラー発生、中止のいずれかイベントにより状態が遷移する。まず、イベントが中断のときは、状態が中断中604に遷移する。イベントがエラー発生のときは、状態がエラー発生中606に遷移する。
状態が中断中604のときは、再実行または中止のイベントにより状態が遷移する。状態がエラー発生中のときは、再実行または中止のイベントにより状態が遷移する。
ジョブの状態遷移は以上のようになっている。次に、ジョブの派生について説明する。図7は、根幹ジョブから派生した子ジョブを示す図である。また、図7に示されるような、ジョブとジョブとの関係を示したものをジョブ構造といい、ジョブ構造を示す情報をジョブ構造情報という。このジョブ構造情報は、本実施の形態ではジョブ構造テーブルと表現され、ジョブ構造テーブルについては後に詳しく説明する。
従来技術において、根幹ジョブはスプールで処理されると消滅するので、根幹ジョブから派生した子ジョブとの親子関係が保持されることはなかった。そこで、本実施例では、どのジョブも自分から派生した全ての子ジョブの処理が終了するまで消滅しないように保持しておくようにする。
例えば、図7において、従来技術ではジョブA400は、ジョブA-A401とジョブA-B402を派生すると消滅していた。そのため図7のようなジョブ構造がMFP内では分からなかった。しかし、本実施例において、ジョブA400は子ジョブであるジョブA-A401とジョブA-B402が処理されるまで保持される。また、ジョブA-A401は子ジョブであるジョブA-A-A403とジョブA-A-B404が処理されるまで保持される。さらに、ジョブA-B402は、ジョブA-B-A405が処理されるまで保持される。このようにすることにより、図7に示すジョブ構造をMFP内で構築することが可能となる。
次に、ジョブの派生パターンについて説明する。図8は、1つのジョブから1つのジョブが派生するパターンを示す図である。図8には、1つのプリントジョブ410から1つの印刷ジョブ411が派生し、その印刷ジョブ411から1つのプロッタジョブ412が派生していることが示されている。
次に、図9を用いて、1つのジョブから複数のジョブが派生するパターンについて説明する。図9には、1つのプリントジョブ415から1つの印刷ジョブ416が派生し、その印刷ジョブ416から白黒プリントジョブ417、カラープリントジョブ418という2つのジョブが派生している。さらに白黒プリントジョブ417からは2つのプロッタジョブ419、420が派生している。また、カラープリントジョブ418からプロッタジョブ421が派生している。
次に、複数のMFPが連携した場合のジョブ構造について説明する。図10は、2つのMFPが連携した場合のジョブ構造を示している。図10には、MFPAが実行するジョブのジョブ構造271と、MFPBが実行するジョブのジョブ構造272とが示されている。
ジョブ構造271には、根幹ジョブである印刷ジョブ259と、白黒プリントジョブ254と、プロッタジョブ255、256がある。ジョブ構造272には、カラープリントジョブ257と、プロッタジョブ258がある。
このように、印刷ジョブ259から派生した白黒プリントジョブ254は、MFPAに、同様に派生したカラープリントジョブ257は、MFPBに割り当てることで、ジョブの分担が可能となる。
なお、図10には、ジョブを特定するためのジョブIDが示されている。ジョブ構造271、272に属するジョブのジョブIDは、そのジョブIDをジョブID全体でユニークなものとされる。
このジョブIDは、6ビットとされ、上位3ビットをMFPの識別コードとし、下位3ビットを、そのMFP内のジョブのなかでユニークな値としている。実際、図10において、MFPA251の識別コードは「001」とされ、MFPBの識別コードは、「002」とされている。また、各ジョブ構造に属するジョブIDの下位3ビットは、各MFP内のジョブのなかでユニークなものとなっている。
以上説明したように、ジョブの派生には、1つのジョブから1つのジョブが派生するパターンと、1つのジョブから複数のジョブが派生するパターンの2つのパターンがある。
次に、ジョブが派生する条件について説明する。あるジョブから他のジョブが派生する条件には、処理を委譲することで他のジョブを派生する場合と、処理を分割して管理するために他のジョブを派生する場合とがある。
最初に、図11を用いて、処理を委譲することで他のジョブを派生する場合について説明する。処理を委譲するとは、あるソフトウェアが自分のジョブを遂行するため、他のソフトウェアに処理の一部を委譲することである。この委譲によりジョブが派生する。
図11は、コピージョブ430の一部の処理を読み取り制御モジュールに委譲することで読み取りジョブ431が派生、印刷制御モジュールに委譲することで印刷ジョブ432が派生した例を示している。
次に、図12を用いて、処理を分割して管理するために他のジョブを派生する場合について説明する。処理を分割して管理するとは、1つのソフトウェア内で、あるジョブの一部をそのジョブとは別に管理することである。この分割によりジョブが派生する。図12は処理を行った印刷ジョブ432の一部にエラーが発生したため、その部分を、正常なジョブ433、435とは別のジョブ434として分割し、個別に状態(実行中/エラーなど)を管理、操作(再実行/中止など)を行う場合の例を示している。
処理を分割することによるジョブの派生の他の例を、図13を用いて説明する。図13は、複数の宛先に同じ文書をFAX送信する場合に、FAX送信ジョブ441を、宛先ごとのFAX送信ジョブ442、443、444として状態を管理、操作を行う場合の例を示している。
以上がジョブの派生に関する説明である。今までの説明に示されるように、本実施の形態におけるジョブとは、印刷処理、プロッタ処理、白黒プリント処理、カラープリント処理、読み取り処理、ページごとの印刷処理、宛先ごとのFAX送信処理である。しかし、これらのジョブは、例示列挙であり、他にも多くのジョブが存在する。これらのジョブを本実施の形態で示すような管理を行うことにより、ジョブの中止など、ジョブに対する操作に加え、ジョブごとに課金が可能なるなどのメリットが生じる。
次に、ジョブをどのようにソフトウェアが処理するかは実装方法によって異なるので、その実装方法について説明する。
ここではシングルプロセス・シングルスレッドで実装する場合、シングルプロセス・マルチスレッドで実装する場合、マルチプロセス・シングルスレッドで実装する場合、マルチプロセス・マルチスレッドで実装する場合の4例の実装方法を示す。
また、ここでは、ユーザのジョブへ再実行や中止などの操作をどのように実装するかも示す。なお、シングルプロセス・マルチスレッドとは、プロセスは1つだが、そのなかでは複数のスレッドがあることをいう。また、マルチプロセス・シングルスレッドとは、プロセスは複数あるが、個々のプロセスにはスレッドは1つしかないことをいう。
これらの例で用いられるジョブのジョブ構造を図14に示す。図14には、処理の過程でジョブA450からジョブB451とジョブC452が派生し、ジョブC452からジョブD453が派生していることが示されている。
まず、図15を用いて、シングルプロセス・シングルスレッドの場合のジョブ処理の例をについて説明する。図15には、プロセスA500と、スレッドA501とが示されている。このソフトウェアのプロセスは1つ(プロセスA500)であり、スレッドもプロセスA500のメインスレッド(スレッドA501)だけである。この場合、ステップS1601でジョブAが実行される。ステップS1602でジョブBが実行される。ステップS1603でジョブCが実行される。ステップS1601でジョブDが実行される。
このように、図15のようなシングルプロセス・シングルスレッドの場合、ジョブA〜ジョブDは全てスレッドA501で処理される。
次に、図16を用いて、シングルプロセス・マルチスレッドの場合のジョブ処理の例を説明する。図16には、プロセスA500と、スレッドA501、スレッドB502、スレッドC503とが示されている。
この場合、ステップS1701で、プロセスA500のメインスレッドであるスレッドA501がジョブAを実行する。このジョブAから派生したサブスレッドであるジョブBに対し、スレッドAがステップS1702で処理を依頼する。
そして、ステップS1703で、スレッドB502がジョブBを実行し、ステップS1704で、スレッドA501に応答を返す。さらにスレッドA501は、サブスレッドであるスレッドC503に、ステップS1705で処理を依頼する。スレッドC503は、ステップS1706でジョブCを実行し、ステップS1707で、ジョブDを実行する。そして、スレッドC503は、ステップS1708でスレッドAに応答を返す。
このように、シングルプロセス・マルチスレッドの場合、スレッドA501は、サブスレッドであるスレッドB502にジョブBを実行させ、ジョブCをサブスレッドであるスレッドC503に実行させている。さらに、ジョブCから派生したジョブDもスレッドC503に実行させている。
次に、図17を用いて、マルチプロセス・シングルスレッドの場合の例を説明する。図17には、プロセスA500と、プロセスB505と、プロセスC506と、スレッドA501、スレッドB502、スレッドC503とが示されている。
ステップS1801で、スレッドA501は、ジョブAを実行する。ステップS1802で、スレッドA501は、プロセスB505のスレッドB502に、処理を依頼する。スレッドB502は、ステップS1803で、ジョブBを実行し、ステップS1804で、スレッドA501に応答を返す。
スレッドA501は、ステップS1805で、プロセスC506のスレッドC503に処理を依頼する。スレッドC503は、ステップS1806で、ジョブCを実行し、さらにステップS1807で、ジョブDを実行し、ステップS1808で、スレッドAに応答を返す。
このように、マルチプロセス・シングルスレッドの場合、プロセスA500のメインスレッドであるスレッドA501でジョブAを実行する。そして、スレッドA501は、ジョブAから派生したジョブBをプロセスB505のメインスレッドであるスレッドB502に、ジョブCをプロセスC506のメインスレッドであるスレッドC503に実行させている。さらに、スレッドA501は、ジョブCから派生したジョブDもスレッドC503に実行させている。
次に、図18を用いて、マルチプロセス・マルチスレッドの場合の例を説明する。図18には、プロセスA500と、プロセスB505と、スレッドA501、スレッドB502、スレッドC503、スレッドD507とが示されている。
ステップS1901で、プロセスA500のスレッドA501は、ジョブAを実行する。ステップS1902でスレッドA501は、同じプロセスA500内のスレッドB502に処理を依頼する。スレッドB502は、ステップS1903で、ジョブBを実行し、ステップS1904で、スレッドA501に応答を返す。
スレッドA501は、ステップS1905で、プロセスB505のスレッドC503に処理を依頼する。スレッドC503は、ステップS1906で、ジョブCを実行する。ステップS1907でスレッドC503は、同じプロセスB505内のスレッドD507に処理を依頼する。スレッドD507は、ステップS1908で、ジョブDを実行し、ステップS1909で、スレッドC503に応答を返す。スレッドC503は、ステップS1910で、スレッドA501に応答を返す。
このように、マルチプロセス・マルチスレッドの場合、プロセスA500のメインスレッドであるスレッドA501でジョブAが処理される。また、スレッドA501は、ジョブAから派生したジョブBをプロセスA500のサブスレッドであるスレッドB502に実行させる。また、スレッドA501は、ジョブAから派生したジョブCをプロセスB505のメインスレッドであるスレッドC503に実行させ、ジョブCから派生したジョブDをプロセスB505のサブスレッドであるスレッドD507に実行させている。
以上が4例の実装方法である。これらの実装方法に加え、さらにマルチプロセス・マルチスレッドという実装方法において、ユーザからの要求によりジョブの処理を操作する例を、図19を用いて説明する。図19には、プロセスA500と、プロセスB505と、プロセスC506と、スレッドA501と、スレッドB502と、スレッドC503と、スレッドE508とが示されている。
このうち、プロセスCがユーザからの要求が行われるプロセスとなっている。ステップS2001で、プロセスA500のスレッドA501は、ジョブAを実行する。ステップS2002でスレッドA501は、同じプロセスA500内のスレッドB502に処理を依頼する。スレッドB502は、ステップS2003で、ジョブBを実行し、ステップS2004で、スレッドA501に応答を返す。
スレッドA501は、ステップS2005で、プロセスB505のスレッドC503に処理を依頼する。スレッドC503は、ステップS2006で、ジョブCを実行する。
このとき、ステップS2007でプロセスC506のスレッドE508は、スレッドC503に処理の中止を依頼する。スレッドC503は、ステップS2008で、ジョブCの中止処理を実行し、ステップS2009で、スレッドA501に応答を返す。
このように、ユーザからの操作の場合、操作の受付用のプロセス(プロセスC506)が存在し、ユーザからの中止要求を受け付け、該当するジョブに中止依頼を出すようになっている。
次に、各ジョブに関する情報であるジョブ情報について、図20を用いて説明する。ジョブ情報は、図20に示されるように、識別情報に対応するジョブIDと、文書名と、ジョブ種別と、状態と、オーナー名と、作成日と、ジョブ関連情報とを有する。
このうち、ジョブ関連情報が、ジョブのジョブ構造をMFP内で構築することを可能とするものであり、このジョブ関連情報については後に詳しく説明することとする。ジョブ構造を構築することが可能であれば、ジョブの親子関係が分かる。
上記ジョブ情報のうち、ジョブIDは、「1」や「2」など、各ジョブを識別するもので、各ジョブに一意的に割り当てられるものである。以下の説明では、ジョブIDがnのジョブを単にジョブnと表現することがある。
文書名は、印刷する文書の名前を示すもので、例えば文字列で表現される。ジョブ種別は、「印刷」、「FAX送信」など、どのような処理のジョブかを示すものである。「状態」は、「実行中」や「エラー」など、ジョブの状態を示すものである。「オーナー名」は、「鈴木」、「佐藤」など、ジョブの実行を依頼したユーザ名を示すものである。「作成日」は、「2004.02.17.12:15」など、ジョブが作成された日時を示すものである。
ジョブ情報の他の例を、図21を用いて説明する。図21に示されるジョブ情報と、図20に示されるジョブ情報とが異なる大きな点は、「ジョブの操作の許可情報」と「ジョブを操作できる条件」なる2つの項目である。
これらの項目は、ジョブの操作、ジョブの状態閲覧を可能とするための項目である。個々のジョブは実行中やエラー発生中などの状態を持ち、そのジョブに対してユーザが再実行や中止などの操作を行うことができる。
しかし、ジョブによってはユーザに操作させなかったり、ある条件を満たす時に限り操作を許したりするものもある。そのような形にジョブを実装する場合、ジョブ情報に図21に示すような「ジョブの操作の許可情報」や「ジョブを操作できる条件」という属性を付加する必要がある。
このうち、「ジョブの操作の許可情報」について説明する。この「ジョブの操作の許可情報」が取り得る値には「許可」、「不許可」、「条件発生時のみ許可」がある。
「許可」とは、どのような場合でもそのジョブの状態に見合った操作(再実行/中止/中断など)が行えることを示す。「不許可」とは、どのような場合でもそのジョブに対しては操作が行えないことを示す。「条件発生時のみ許可」とは、図21に示される「ジョブを操作できる条件」が成就した時に、その条件に見合った操作を行えることを示す。具体的に、操作として、エラー発生の場合の再実行または中止が挙げられる。
これらの値のうち、「不許可」の場合のジョブ情報を示すのが、図22に示されるジョブ情報である。このジョブ情報の「ジョブの操作の許可情報」は「不許可」となっている。また、「条件発生時のみ許可」の場合のジョブ情報を示すのが、図23に示されるジョブ情報である。このジョブ情報の「ジョブの操作の許可情報」は「条件発生時のみ許可」となっており、「ジョブを操作できる条件」が「実行中&エラー発生中」であることが示されている。
なお、「ジョブを操作できる条件」は、「エラー発生中」、「実行中またはエラー発生中」、「待機中またはエラー発生中」、「実行中または待機中&エラー発生中」の値もとり得る。「エラー発生中」は、ジョブがエラー発生中という条件である。「実行中またはエラー発生中」は、ジョブが実行中もしくはジョブがエラー発生中という条件である。「待機中またはエラー発生中」は、ジョブが待機中もしくはジョブがエラー発生中という条件である。「実行中または待機中またはエラー発生中」は、ジョブが実行中、ジョブが待機中、ジョブがエラー発生中のうちのいずれか条件である。
次に、ジョブ関連情報に基づき作成されるジョブ構造テーブルについて、図24を用いて説明する。ジョブ構造テーブル100は、親ジョブと子ジョブのIDからなるものである。「子ジョブ」は、ジョブIDを示し、「親ジョブ」は、子ジョブで示されたジョブIDを有するジョブの親ジョブのジョブIDを示している。従って、親ジョブが記入されていないジョブは、親ジョブが存在しないジョブなので、根幹ジョブということになる。
また、ジョブ構造101、102は、ジョブ構造テーブル100をジョブ構造として表現したものである。
図24の場合、ジョブ1と、ジョブ8は根幹ジョブであることが分かる。また、ジョブ構造テーブル100には、ジョブ2、3のジョブの親ジョブのIDが1と示されてあるので、ジョブ2、3は、ジョブ1から派生したジョブであることが分かる。同様に、他のジョブに関しても、ジョブ構造テーブル100に示される各ジョブIDにより、図24に示されるジョブ構造を生成できる。
このように、ジョブの親ジョブのジョブIDを各ジョブごとに保持しておくとことで、ジョブ構造テーブルを作成することができる。また、このジョブ構造テーブルにより、パソコンの画面、あるいはMFPに設けられているオペレーションパネルにジョブ構造を表示することができる。
なお、ジョブ構造テーブルは、図25に示されるように、XMLで表現することもできる。図25に示されるXML文は、図24で示した根幹ジョブで、ジョブ8から派生したジョブのジョブ構造102を生成するためものである。
この図25より、ジョブ8は、ジョブ9、10、11のジョブを、子ジョブあるいは孫ジョブとしていることが分かる。同様に、ジョブ9は、ジョブ8を親ジョブとし、ジョブ10、11を子ジョブとしていることが分かる。さらにジョブ10、11は、ともにジョブ9を親ジョブとしていることが分かる。
このようにジョブ構造テーブルは、ジョブIDを入れ子とするXML文で表現することができる。また、ジョブ構造テーブルは、任意のジョブと他のジョブとの関連を示していることがわかる。
以上が処理の概要である。次に、各処理の詳細な説明をする。まず、図26を用いてMFPに発生するジョブを、コピーを例にして説明する。図26には、コピー蓄積ジョブ110と、読み取りジョブ111と、プリントジョブ112と、蓄積ジョブ113と、プロッタジョブ114、115が示されている。このジョブ構造における根幹ジョブは、コピー蓄積ジョブ110である。
コピー蓄積の要求に対して、コピー蓄積ジョブ110が発生し、それを実現するために読み取りジョブ111、プリントジョブ112、蓄積ジョブ113が派生する。プリントジョブ112からは、さらにプロッタジョブ114、115が派生する。
次に、図27を用いて、MFPのソフトウェアブロックについて説明する。この図27で説明される「アプリ」、「モジュール」、「ハンドラ」をまとめて、プログラムということにする。
図27に示されるソフトウェアブロックは、アプリケーション層5と、サービス層7と、ハンドラ層9の3つの層に分けられる。アプリケーション層5は、コピーアプリ21と、プリンタアプリ20と、FAXアプリ22などのプログラムを含む。サービス層7は、印刷制御モジュール23と、FAX制御モジュール24と、読み取り制御モジュール25と、ジョブ管理モジュール26のプログラムを含む。ハンドラ層9は、プロッタハンドラ27と、FAXユニットハンドラ28と、スキャナハンドラ29と、メモリ管理モジュール30のプログラムを含む。
アプリケーション層5のコピーアプリ21、プリンタアプリ20、FAXアプリ22は、それぞれ、コピー用、プリンタ用、FAX用のアプリケーションである。
次に、サービス層7のモジュールについて説明する。印刷制御モジュール23は、印刷処理を制御するモジュールである。FAX制御モジュール24は、FAX処理を制御するモジュールである。読み取り制御モジュール25は、読み取り処理を制御するモジュールである。全体ジョブ構造情報作成手段とジョブ検索手段に対応するジョブ管理モジュール26は、要求によりジョブ構造テーブル(ジョブ構造情報)を作成して要求元に渡すモジュールである。
次に、ハンドラ層9のプログラムについて説明する。ハンドラ層9のプログラムは、ハードウェアであるプロッタやスキャナなどのハンドラなどである。
プロッタハンドラ27は、プロッタのハンドラである。FAXユニットハンドラ28は、FAXユニットのハンドラである。スキャナハンドラ29は、スキャナのハンドラである。メモリ管理モジュール30は、メモリやハードディスクの管理を行うハンドラである。
次に、MFPのハードウェア構成図を、図28を用いて説明する。MFPは、コントローラボード60と、オペレーションパネル53と、FCU68と、エンジン71と、スキャナ51と、プロッタ52とを含む。また、FCU68は、G3規格対応ユニット69と、G4規格対応ユニット70とを有する。
また、コントローラボード60は、CPU61と、ASIC66と、HDD65と、ローカルメモリ(MEM−C)64と、システムメモリ(MEM−P)63と、ノースブリッジ(以下、NBと記す)62と、サウスブリッジ(以下、SBと記す)73と、NIC74(Network Interface Card)と、USBデバイス75と、IEEE1394デバイス76と、セントロニクスデバイス77とを含む。
オペレーションパネル53は、コントローラボード60のASIC66に接続されている。また、SB73と、NIC74と、USBデバイス75と、IEEE1394デバイス76と、セントロニクスデバイス77と、NB62にPCIバスで接続されている。
また、FCU68と、エンジン71と、スキャナ51、プロッタ52は、コントローラボード60のASIC66にPCIバスで接続されている。
なお、コントローラボード60は、ASIC66にローカルメモリ64、HDD65などが接続されると共に、CPU61とASIC66とがCPUチップセットのNB62を介して接続されている。このように、NB62を介してCPU61とASIC66とを接続すれば、CPU61のインタフェースが公開されていない場合に対応できる。
なお、ASIC66とNB62とはPCIバスを介して接続されているのでなく、AGP(Accelerated Graphics Port)67を介して接続されている。このように、図27のアプリケーション層5などを形成する一つ以上のプロセスを実行制御するため、ASIC66とNB62とを低速のPCIバスでなくAGP67を介して接続し、パフォーマンスの低下を防いでいる。
CPU61は、MFPの全体制御を行うものである。CPU61は、アプリケーション層5、サービス層7、ハンドラ層9に含まれるプログラムをOS上にそれぞれプロセスとして起動して実行させる。
NB62は、CPU61、システムメモリ63、SB73およびASIC66を接続するためのブリッジである。システムメモリ63は、MFPの描画用メモリなどとして用いるメモリである。SB73は、NB62とPCIバス、周辺デバイスとを接続するためのブリッジである。また、ローカルメモリ64はコピー用画像バッファ、符号バッファとして用いるメモリである。
ASIC66は、画像処理用のハードウェア要素を有する画像処理用途向けのICである。HDD65は、画像データの蓄積、文書データの蓄積、プログラムの蓄積、フォントデータの蓄積、フォームの蓄積などを行うためのストレージである。また、オペレーションパネル53は、ユーザからの入力操作を受け付けると共に、ユーザに向けた表示を行う操作部である。
次に、上述した各ソフトウェアの関係と、各ソフトウェア間でやり取りされる情報について、図29と図30を用いて説明する。図29は、ジョブ情報がHDD65に記憶される場合を示す図であり、図30は、ジョブ情報がメモリ上に記憶される場合を示す図である。
まず、図29の説明をする。図29には、各プログラム130と、メモリ管理モジュール30と、HDD65と、ジョブ情報132と、ジョブ管理モジュール26と、表示アプリ32と、専用キュー131とが示されている。
各プログラム130は、アプリ層、サービス層、ハンドラ層の各プログラムである。具体的には、ジョブ管理モジュールとメモリ管理モジュール以外のプログラムであり、ジョブを発生・処理するプログラムである。表示アプリ32は、パソコンで表示するPCアプリや、上述したオペレーションパネル用のアプリである。ジョブ情報132は、図20で説明したジョブ情報であり、図29の場合、HDD65に記憶されている。専用キュー131は、各プログラム用のメモリ空間に記憶される各プログラムがジョブを管理する専用のキューである。
なお、各プログラムのメモリ空間とは、そのプログラムにそれぞれ割り当てられたメモリ領域を指す。ここに各モジュールは専用のキューを持っており、処理するジョブの順番を管理している。
各プログラム130からメモリ管理モジュール30へはジョブ情報が提供される。メモリ管理モジュール30は、ジョブ情報をHDD65に記憶する。また、メモリ管理モジュール30は、ジョブ管理モジュール26にジョブ情報を提供する。ジョブ管理モジュール26は、表示アプリ32にジョブ構造テーブルとジョブ情報を提供する。各プログラム130は、ジョブ管理モジュール26にキューの情報を提供する。また、各プログラム130は、専用キュー131にジョブIDを記憶させる。
次に、図30の説明をする。なお、図29で説明した参照符号と同じものは、説明を省略する。図30と図29で異なるのは、キュー133とジョブ情報132である。キュー133とジョブ情報132は、図30に示されるように、各プログラム用のメモリ空間に記憶される。従って、キュー133とジョブ情報132は、各プログラム専用のものとなる。
各プログラム130は、キュー133とジョブ情報132にそれぞれジョブIDとジョブ情報を記憶させる。また、各プログラム130は、ジョブ管理モジュール26にキューの情報とジョブ情報を提供する。ジョブ管理モジュール26は、表示アプリ32にジョブ構造テーブルとジョブ情報を提供する。この表示アプリ32は、GUI表示手段とジョブ構造情報取得手段に対応する。
この図30の場合、ジョブ情報はHDDではなく各プログラムが管理するメモリ空間で保存されている。よって、ジョブ管理モジュール62はジョブを持っている各プログラムからジョブ情報を取得し、ジョブ構造テーブルを作成する。
次に、ジョブ関連情報について説明する。このジョブ関連情報は上述したように、ジョブ構造テーブルの作成に必要なものである。このジョブ関連情報は、ジョブ構造テーブルを作成できればよいので、いくつかの種類が考えられる。以下、7種類のジョブ関連情報の例とそのときの処理を示すシーケンス図について説明する。シーケンス図で説明する処理は、印刷要求を行ったときのジョブ登録処理と、ジョブの参照を行ったときの処理である。
なお、それぞれで示されるジョブ情報は図20または図21で説明した構造を例としている。また、以下の説明で用いられるジョブ構造は、図31に示されるジョブ構造とする。図31に示されるジョブ構造は、ジョブAから派生したジョブで構成されるジョブのジョブ構造である。
第1のジョブ関連情報例について、図32を用いて説明する。図32に示されるジョブ関連情報は、子ジョブの親ジョブのジョブIDから根幹ジョブのジョブIDまで、というように、子ジョブが全ての先祖のジョブのジョブIDを持っているものである。
具体的に、図33に示されるジョブ情報を用いて説明する。この図33に示されるジョブ情報は、図31のジョブ7のジョブ情報である。
図33には、ジョブ情報150と、ジョブ関連情報151とが示されている。ジョブ情報150は、図20で説明したものである。ジョブ関連情報151は、項目に「根幹ジョブのジョブID」と「2世代目のジョブID」と、「親ジョブのジョブID」があり、それぞれ値が「1」、「2」、「4」となっている。
実際に、ジョブ7の親ジョブはジョブ4であり、2世代目のジョブはジョブ2であり、根幹ジョブはジョブ1である。
このように、子ジョブが全ての先祖のジョブのジョブIDを持っており、ジョブ管理モジュールが末端ジョブを識別する仕組みが構築されると、ジョブ管理モジュールは末端ジョブの情報を取得するだけで、ジョブ構造テーブルを作成できる。また、アプリ層、サービス層、ハンドラ層の各プログラムは、ジョブ生成時に、親ジョブのジョブ構造テーブルに、親のジョブIDを追記するだけで、ジョブ関連情報を作成できる。なお、ジョブ管理モジュールが末端ジョブを識別する仕組みとして、ジョブ情報に末端ジョブかを判別するフラグを設けるなどの仕組みが挙げられる。
以上説明した第1のジョブ関連情報例の場合の処理を、シーケンス図を用いて説明する。図34は、ジョブ登録時の動作シーケンスを示すもので、ユーザ160と、プリンタアプリ20と、印刷制御モジュール23と、プロッタハンドラ27と、メモリ管理モジュール30との間で行われる処理を示している。このことは、以降のジョブ登録時の動作シーケンス図でもほぼ同じである。
ステップS101で、プリンタアプリ20は、ユーザ160から印刷要求を通知される。プリンタアプリ20は、ステップS102で、ジョブの生成を行い、ステップS103で、ジョブIDをキューに追加する。ステップS104で、プリンタアプリ20は、メモリ管理モジュールにジョブ情報を通知することで、ジョブ情報を保存する。
ステップS105で、プリンタアプリ20は、キューからジョブIDを取得する。ステップS107で、メモリ管理モジュール30は、プリンタアプリ20にジョブ情報を通知する。ステップS108は、プリンタアプリ20の処理の実行である。
ステップS109で、プリンタアプリ20は、印刷制御モジュール23に印刷処理要求を通知する。このとき、親ジョブのジョブ関連情報と、親ジョブのジョブIDも通知される。印刷モジュール23は、ステップS110でジョブの生成を行い、ステップS111でジョブIDをキューに追加する。そして、ステップS112で印刷制御モジュール23は、ジョブ情報を保存する。次のステップS113で、印刷制御モジュール23は、ジョブIDをキューから取得する。
印刷制御モジュール23は、ステップS114で、メモリ管理モジュール30にジョブ情報の取得を要求する。メモリ管理モジュール30は、ステップS115で、印刷制御モジュール23にジョブ情報を通知する。
ステップS116は、印刷制御モジュール23の処理の実行である。ステップS117で印刷制御モジュール23は、プロッタハンドラ27にプロット要求を通知する。このとき、親ジョブのジョブ関連情報と親ジョブIDも通知される。
ステップS118で、プロッタハンドラ27は、ジョブの生成を行う。ステップS119で、プロッタハンドラ27は、ジョブIDをキューに追加し、ステップS120で、ジョブ情報を保存する。ステップS121で、プロッタハンドラ27は、ジョブIDをキューから取得する。ステップS122で、プロッタハンドラ27は、メモリ管理モジュール30にジョブ情報の取得を要求する。ステップS123で、メモリ管理モジュール30は、プロッタハンドラ27にジョブ情報を通知する。
プロッタハンドラ27は、ステップS124で、プロットを実行する。プロッタハンドラ27は、印刷制御モジュール23に、ステップS125で、プロット終了を通知する。印刷制御モジュール23は、ステップS126で、プリンタアプリ20に印刷終了を通知する。プリンタアプリ20は、ステップS127で、ユーザ160に印刷終了を通知(表示)する。
次に、図35を用いて、ジョブ参照時の動作シーケンスを説明する。図35は、ユーザ160と、オペパネアプリ161と、ジョブ管理モジュール26と、メモリ管理モジュール30と、プリンタアプリ20との間で行われる処理を示している。このことは、以降のジョブ参照時の動作シーケンス図でもほぼ同じである。
ステップS201で、オペパネアプリ161は、ユーザ160からジョブ参照要求を通知される。ステップS202で、オペパネアプリ161は、ジョブ管理モジュール26にジョブ一覧要求を通知する。ジョブ管理モジュール26は、ステップS203で、メモリ管理モジュール30に末端ジョブの検索を通知する。ステップS204で、メモリ管理モジュール30は、ジョブ管理モジュール26に末端ジョブの検索結果を通知する。ステップS205で、ジョブ管理モジュール26は、メモリ管理モジュール30にジョブ情報の取得を要求する。ステップS206で、メモリ管理モジュール30は、ジョブ管理モジュール26にジョブ情報を通知する。ジョブ管理モジュール26は、ステップS207で、ジョブ一覧の作成を行う。
ジョブ構造受信段階に対応するステップS208で、ジョブ管理モジュール26は、オペパネアプリ161にジョブ一覧を通知する。オペパネアプリ161は、GUI表示段階に対応するステップS209で、ユーザ160に、ジョブ一覧を通知(表示)する。ステップS210で、オペパネアプリ161は、ユーザ160からジョブ情報を要求される。ステップS211で、オペパネアプリ161は、ジョブ管理モジュール26にジョブ情報の取得を要求する。ジョブ管理モジュール26は、ステップS212で、メモリ管理モジュール30にジョブ情報の取得を要求する。メモリ管理モジュール30は、ステップS213で、ジョブ管理モジュール26にジョブ情報を通知する。
ステップS214で、ジョブ管理モジュール26は、プリンタアプリ20に、キューの順番取得を要求する。プリンタアプリ20は、ステップS215で、ジョブ管理モジュール26にキューの順番を通知する。ジョブ管理モジュール26は、ステップS216で、オペパネアプリ161にジョブ情報を通知する。ステップS217で、オペパネアプリ161は、ユーザ160にジョブ情報を通知(表示)する。
次に、第2のジョブ関連情報例について、図36を用いて説明する。第2のジョブ関連情報例は、図36に示されるように、ジョブ情報内のジョブ関連情報に、親ジョブのジョブIDのみを持っているものである。
具体的に、図37に示されるジョブ情報を用いて説明する。この図37に示されるジョブ情報は、図31のジョブ7のジョブ情報である。ジョブ関連情報は、項目に「親ジョブのジョブID」のみであり、値が「4」となっている。
このように、ジョブ関連情報が親ジョブのジョブIDのみであれば、ジョブ情報の情報量を抑えることが可能となる。この場合、ジョブ管理モジュールが全ジョブにアクセスする仕組みが必要となる。
以上説明した第2のジョブ関連情報例の場合のジョブ登録時の動作を、図38のシーケンス図を用いて説明する。なお、このシーケンス図は、図34で示したシーケンス図でのステップのうち、2つのステップ以外は同じであるので、異なるステップ以外の説明は省略する。
異なるステップは、図34におけるステップS109とステップS117であり、図38では、それぞれステップS309とステップS317に対応する。
ステップS109では、親ジョブのジョブ関連情報が通知されるが、ステップS309では、親ジョブのジョブIDのみが通知される。また、ステップS117も同様に、親ジョブのジョブ関連情報と親ジョブのジョブIDの2つが通知されるが、ステップS317では、親ジョブのジョブIDのみが通知される。
いずれのステップの処理も、ジョブ関連情報が親ジョブのジョブIDとなったことによるものである。
次に、図39を用いて、ジョブ参照時の動作シーケンスを説明する。なお、このシーケンス図は、図35で示したシーケンス図のステップS201、202は、ステップS401、402に対応し、ステップS205からステップS217は、ステップS404からステップS415に対応する。
従って、図39に示される処理は、図35の処理から、末端ジョブの検索処理であるステップS203、204の処理を除いたものである。これは、ジョブ管理モジュールが全ジョブにアクセスするため、特定のジョブの検索の必要がないためである。
次に、第3のジョブ関連情報例について、図40を用いて説明する。図40に示されるジョブ関連情報は、ジョブが全ての子孫ジョブのジョブIDを持っているものである。
具体的に、図41に示されるジョブ情報を用いて説明する。図41には、ジョブ情報167と、ジョブ関連情報168とが示されている。ジョブ情報167に示されるように、このジョブ情報は、図31に示されているジョブ7のジョブ情報である。
ジョブ関連情報168は、値に「子ジョブ」と「親ジョブ」がある。子ジョブで示されるジョブIDの親ジョブのジョブIDが親ジョブの欄に記載される。
実際に、ジョブ2、3の親ジョブはジョブ1であり、ジョブ4、5の親ジョブは、ジョブ2であり、ジョブ6の親ジョブはジョブ3であり、ジョブ7の親ジョブはジョブ4である。
このように、ジョブ関連情報が子孫ジョブのジョブIDあれば、ジョブ管理モジュールは、根幹ジョブのジョブ情報を取得するだけでジョブ構造テーブルの作成が可能となる。この場合、ジョブを生成したモジュールが、先祖のジョブを生成した全モジュールにジョブIDを通知する仕組みが必要である。さらに、ジョブ管理モジュールが保存されているジョブから根幹ジョブを探す仕組みが必要である。
以上説明した第3のジョブ関連情報例の場合のジョブ登録時の動作を、図42のシーケンス図を用いて説明する。なお、このシーケンス図は、図34で示したシーケンス図のステップS101からステップS108までの処理と、ステップS501からステップS508までの処理が同じなので説明を省略する。
ステップS509で、プリンタアプリ20は、印刷制御モジュール23に印刷処理要求を通知する。このとき、親ジョブのジョブ関連情報と、親ジョブのジョブIDは通知されない。印刷モジュール23は、ステップS510でジョブの生成を行い、ステップS511でプリンタアプリ20に子ジョブ生成を通知する。次のステップS512で、プリンタアプリ20は、ジョブIDをキューに追加する。そして、ステップS513で印刷制御モジュール23は、ジョブ情報を保存する。次のステップS514で、印刷制御モジュール23は、ジョブIDをキューから取得する。
印刷制御モジュール23は、ステップS515で、メモリ管理モジュール30にジョブ情報の取得を要求する。メモリ管理モジュール30は、ステップS516で、印刷制御モジュール23にジョブ情報を通知する。
ステップS517は、印刷制御モジュール23の処理の実行である。ステップS518で印刷制御モジュール23は、プロッタハンドラ27にプロット要求を通知する。ステップS519で、プロッタハンドラ27は、ジョブの生成を行う。
ステップS520で、プロッタハンドラ27は、印刷制御モジュール23に、ジョブIDとともに子ジョブの生成を通知する。ステップS521で、印刷制御モジュール23は、プリンタアプリ20に子孫ジョブの生成を通知する。このとき、親ジョブIDと子ジョブIDも通知される。
ステップS522で、プロッタハンドラ27は、ジョブIDをキューに追加し、ステップS523で、ジョブ情報を保存する。ステップS524で、プロッタハンドラ27は、ジョブIDをキューから取得する。ステップS525で、プロッタハンドラ27は、メモリ管理モジュール30にジョブ情報の取得を要求する。ステップS526で、メモリ管理モジュール30は、プロッタハンドラ27にジョブ情報を通知する。
プロッタハンドラ27は、ステップS527で、プロットを実行する。プロッタハンドラ27は、印刷制御モジュール23に、ステップS528で、プロット終了を通知する。印刷制御モジュール23は、ステップS529で、プリンタアプリ20に印刷終了を通知する。プリンタアプリ20は、ステップS530で、ユーザ160に印刷終了を通知(表示)する。
次に、図43を用いて、ジョブ参照時の動作シーケンスを説明する。なお、このシーケンス図は、図35で示したシーケンス図でのステップのうち、2つのステップ以外は同じであるので、異なるステップ以外の説明は省略する。
異なるステップは、図35におけるステップS203とステップS204であり、図43では、それぞれステップS603とステップS604に対応する。図35の場合、検索の対象は、末端ジョブであったが、図43では、検索の対象が根幹ジョブとなる。
次に、第4のジョブ関連情報例について、図44を用いて説明する。図44に示されるジョブ関連情報は、ジョブが全ての子ジョブのジョブIDを持っているものである。
具体的に、図45に示されるジョブ情報を用いて説明する。図45には、ジョブ情報163と、ジョブ関連情報164とが示されている。ジョブ情報163に示されるように、このジョブ情報は、図31に示されているジョブ1のジョブ情報である。
ジョブ関連情報164には、項目に2つの「子ジョブのジョブID」があり、それぞれ値が「2」、「3」となっている。実際に、ジョブ1の子ジョブはジョブ2とジョブ3である。
このように、ジョブ関連情報が子ジョブのジョブIDのみであれば、ジョブ情報の情報量を抑えることが可能となる。この場合、ジョブ管理モジュールが全ジョブにアクセスする仕組みが必要となる。
以上説明した第4のジョブ関連情報例の場合の処理を、図46のシーケンス図を用いて説明する。なお、このシーケンス図は、図42で示したシーケンス図のステップS521の処理を行わないこと以外は、処理が同じなので説明を省略する。これは、第4のジョブ関連情報は、子孫ジョブを必要としないので、子孫ジョブの生成を通知する図42のステップS521の処理は不要となるからである。
ジョブ参照時の動作シーケンスは、図39と同じであるため、説明を省略する。
次に、第1、4のジョブ関連情報を組み合わせた第5のジョブ関連情報例について、図47を用いて説明する。図47に示されるジョブ関連情報は、ジョブが全ての先祖のジョブIDと、全ての子ジョブのジョブIDからなる。
具体的に、図48に示されるジョブ情報を用いて説明する。図48には、ジョブ情報166と、ジョブ関連情報169とが示されている。ジョブ情報166に示されるように、このジョブ情報は、図31に示されているジョブ4のジョブ情報である。
ジョブ関連情報169には、項目に「根幹ジョブのジョブID」と、「親ジョブのジョブID」と、「子ジョブのジョブID」があり、それぞれ値が「1」、「2」、「7」となっている。実際に、ジョブ4の根幹ジョブはジョブ1であり、親ジョブはジョブ2であり、子ジョブは、ジョブ7である。
このようなジョブ関連情報であれば、ジョブ管理モジュールは末端ジョブの情報を取得するだけで、ジョブ構造テーブルが作成できる。また、アプリ層、サービス層、ハンドラ層の各プログラムは、親のジョブ関連情報に親のジョブIDを追記するだけなので、ジョブ生成時にジョブ関連情報を作成するのが容易となる。さらに、子ジョブのジョブIDの項目に値がない場合は末端ジョブであるので、末端ジョブの検索が子ジョブのジョブIDの項目に値が入っているかどうかを見ることで可能となる。なお、値が入っていないとは、実質的な値が入っていないことであり、例えばNULLもしくは0xffffなど、設計でよく用いられる値が入っていることであっても良い。なお、ジョブを生成するモジュールは、親ジョブを生成したモジュールに子ジョブのジョブIDを通知する必要がある。
以上説明した第5のジョブ関連情報例の場合のジョブ登録時の動作を、図49のシーケンス図を用いて説明する。なお、このシーケンス図は、図34で示したシーケンス図と一部異なるので、その異なる部分を説明することにする。
ステップS809は、ステップS109に対応するが、親ジョブ用のジョブ関連情報のみが通知される。また、ステップS810でジョブを生成した後、ステップS811で、プリンタアプリ20に子ジョブの生成を通知する処理が追加される。
またステップS818のプロット要求では、親ジョブのジョブ関連情報のみが通知される。さらに、ステップS819のジョブの生成後に、プロッタハンドラ27から印刷制御モジュール23へ子ジョブの生成が通知される。
ジョブ参照時の動作シーケンスは、図35と同じであるため、説明を省略する。
次に、第2、3のジョブ関連情報を組み合わせた第6のジョブ関連情報例について、図50を用いて説明する。図50に示されるジョブ関連情報は、親ジョブのジョブIDと、全ての子孫ジョブのジョブIDからなる。
具体的に、図51に示されるジョブ情報を用いて説明する。図51には、ジョブ情報170と、ジョブ関連情報171とが示されている。ジョブ情報170に示されるように、このジョブ情報は、図31に示されているジョブ1のジョブ情報である。
ジョブ関連情報171には、項目に「子ジョブ」と、「親ジョブ」がある。子ジョブで示されるジョブIDの親ジョブのジョブIDが親ジョブの欄に記載される。
実際、ジョブ1は根幹ジョブであるので、親ジョブは存在せず、ジョブ2、3の親ジョブはジョブ1であり、ジョブ4、5の親ジョブはジョブ2であり、ジョブ6の親ジョブはジョブ3であり、ジョブ7の親ジョブは、ジョブ4である。
この第6のジョブ関連情報では、根幹ジョブの情報を取得するだけで、ジョブ構造テーブルが作成できる。なお、根幹ジョブのジョブ関連情報には、親ジョブのジョブIDの項目に値が入っていないことから、根幹ジョブを判別することができる。
以上説明した第6のジョブ関連情報例の場合のジョブ登録時の動作を、図52のシーケンス図を用いて説明する。なお、このシーケンス図は、図34で示したシーケンス図と一部異なるので、その異なる部分を説明することにする。
ステップS909は、ステップS109に対応するが、親ジョブのジョブIDのみ通知される。また、ステップS910でジョブを生成した後、ステップS911で、プリンタアプリ20に子ジョブの生成を通知する処理が追加される。また、ステップS918は、ステップS117に対応するが、親ジョブのジョブIDのみ通知される。さらに、ステップS920で子ジョブの生成通知後、ステップS921で、印刷制御モジュール23からプリンタアプリ20に子孫ジョブの生成が通知される処理が加わる。
ジョブ参照時の動作シーケンスは、図43と同じであるため、説明を省略する。
次に、ジョブ管理モジュール26で一括管理する第7のジョブ関連情報例について、図53を用いて説明する。
第7のジョブ関連情報例は、各モジュールでの処理において子ジョブが派生した場合は、各モジュールがジョブ管理モジュールに派生した子ジョブのジョブIDと親のジョブIDの対応を通知することで生成される。ジョブ管理モジュール26は、全ジョブの対応関係を保持しており、表示アプリにジョブ構造を表示させる場合はその情報を表示アプリに通知するようになっている。
図53には、ジョブの関係図172、173、174と、プリンタアプリ20と、印刷制御モジュール23と、ジョブ管理モジュール26とが示されている。
関係図172は、プリンタアプリ20が生成したジョブの関係図である。関係図173は、印刷制御モジュール23が生成したジョブの関係図である。関係図174は、関係図172、173に基づき、ジョブ管理モジュール26が生成した関係図である。
関係図172で示されているジョブの関係と、関係図173で示されているジョブの関係が、関係図174に反映されていることが分かる。この場合、ジョブ情報は、ジョブ関連情報を持たなくても良い。
以上説明した第7のジョブ関連情報例の場合のジョブ登録時の動作を、図54のシーケンス図を用いて説明する。なお、このシーケンス図は、図34で示したシーケンス図と一部異なるので、その異なる部分を説明することにする。
ステップS1002のプリンタアプリ20がジョブを生成する処理の後に、ステップS1003と、ステップS1004の処理が追加される。ステップS1003の処理は、プリンタアプリ20からジョブ管理モジュール26へのジョブ生成の通知である。このとき、親ジョブIDと子ジョブIDが通知される。また、ステップS1004は、ジョブ管理モジュール26によるジョブ構造テーブルの更新である。
ステップS1011は、ステップS109に対応するが、親ジョブのジョブIDのみの通知となる。
ステップS1012の印刷制御モジュール23がジョブを生成する処理の後に、ステップS1013と、ステップS1014の処理が追加される。ステップS1013の処理は、印刷制御モジュール23からジョブ管理モジュール26へのジョブ生成の通知である。このとき、親ジョブIDと子ジョブIDが通知される。また、ステップS1014は、ジョブ管理モジュール26によるジョブ構造テーブルの更新である。
ステップS1021は、ステップS117に対応するが、親ジョブのジョブIDのみの通知となる。
ステップS1022のプロッタハンドラ27がジョブを生成する処理の後に、ステップS1023と、ステップS1024の処理が追加される。ステップS1023の処理は、プロッタハンドラ27からジョブ管理モジュール26へのジョブ生成の通知である。このとき、親ジョブIDと子ジョブIDが通知される。また、ステップS1024は、ジョブ管理モジュール26によるジョブ構造テーブルの更新である。
次に、図55を用いて、ジョブ参照時の動作シーケンスを説明する。図55は、ユーザ160と、オペパネアプリ161と、ジョブ管理モジュール26と、プリンタアプリ20と、メモリ管理モジュール30との間で行われる処理を示している。
ステップS1101で、オペパネアプリ161は、ユーザ160からジョブ参照要求を通知される。ステップS1102で、オペパネアプリ161は、ジョブ管理モジュール26にジョブ一覧要求を通知する。ステップS1103で、ジョブ管理モジュール26は、オペパネアプリ161にジョブ一覧を通知する。オペパネアプリ161は、ステップS1104で、ユーザ160に、ジョブ一覧を通知(表示)する。ステップS1105で、オペパネアプリ161は、ユーザ160からジョブ情報を要求される。ステップS1106で、オペパネアプリ161は、ジョブ管理モジュール26にジョブ情報の取得を要求する。
ジョブ管理モジュール26は、ステップS1107で、メモリ管理モジュール30に、ジョブ情報の取得を要求する。メモリ管理モジュール30は、ステップS1108で、ジョブ管理モジュール26にジョブ情報を通知する。
ジョブ管理モジュール26は、ステップS1109で、プリンタアプリ20に、キューの順番取得を要求する。プリンタアプリ20は、ステップS1110で、ジョブ管理モジュール26にキューの順番を通知する。ジョブ管理モジュール26は、ステップS1111で、オペパネアプリ161にジョブ情報を通知する。ステップS1112で、オペパネアプリ161は、ユーザ160にジョブ情報を通知(表示)する。
次に、ソフトウェアの構成が図30で説明した構成であり、ジョブ関連情報が図32に示したジョブ関連情報の場合の処理について説明する。図30における構成は、ジョブ情報は各アプリ層、サービス層のモジュールが各自のメモリ空間に保持する構成である。この構成でのジョブ登録時の動作シーケンスを、図56を用いて説明する。
図56には、ユーザ160と、プリンタアプリ20と、印刷制御モジュール23と、プロッタハンドラ27との間で行われる処理を示している。
ステップS1201で、プリンタアプリ20は、ユーザ160から印刷要求を通知される。プリンタアプリ20は、ステップS1202で、ジョブの生成を行い、ステップS1203で、ジョブIDをキューに追加する。ステップS1204で、プリンタアプリ20は、キューからジョブIDを取得し、ステップS1205で、処理を実行する。
ステップS1206で、プリンタアプリ20は、印刷制御モジュール23に印刷処理要求を通知する。このとき、親ジョブのジョブ関連情報と、親ジョブのジョブIDも通知される。印刷モジュール23は、ステップS1207でジョブの生成を行い、ステップS1208でジョブIDをキューに追加する。そして、印刷制御モジュール23は、ステップS1209でジョブIDをキューから取得し、ステップS1210で処理を実行する。
ステップS1211で印刷制御モジュール23は、プロッタハンドラ27にプロット要求を通知する。このとき、親ジョブのジョブ関連情報と親ジョブIDも通知される。
ステップS1212で、プロッタハンドラ27は、ジョブの生成を行う。ステップS1213で、プロッタハンドラ27は、ジョブIDをキューに追加し、ステップS1214でジョブIDをキューから取得する。
プロッタハンドラ27は、ステップS1215で、プロットを実行する。プロッタハンドラ27は、印刷制御モジュール23に、ステップS1216で、プロット終了を通知する。印刷制御モジュール23は、ステップS1217で、プリンタアプリ20に印刷終了を通知する。プリンタアプリ20は、ステップS1218で、ユーザ160に印刷終了を通知(表示)する。
次に、図57を用いて、ジョブ参照時の動作シーケンスを説明する。図57は、ユーザ160と、オペパネアプリ161と、ジョブ管理モジュール26と、プリンタアプリ20と、印刷制御モジュール23と、プロッタハンドラ27との間で行われる処理を示している。
ステップS1301で、オペパネアプリ161は、ユーザ160からジョブ参照要求を通知される。ステップS1302で、オペパネアプリ161は、ジョブ管理モジュール26にジョブ一覧要求を通知する。
ジョブ管理モジュール26は、ステップS1303で、プリンタアプリ20にジョブ情報の取得を要求する。ステップS1304で、プリンタアプリ20は、ジョブ管理モジュール26にジョブ情報を通知する。
ジョブ管理モジュール26は、ステップS1305で、印刷制御モジュール23にジョブ情報の取得を要求する。ステップS1306で、印刷制御モジュール23は、ジョブ管理モジュール26にジョブ情報を通知する。
ジョブ管理モジュール26は、ステップS1307で、プロッタハンドラ27にジョブ情報の取得を要求する。ステップS1308で、プロッタハンドラ27は、ジョブ管理モジュール26にジョブ情報を通知する。
ステップS1309で、ジョブ管理モジュール26は、ジョブ一覧の作成を行う。ステップS1310で、ジョブ管理モジュール26は、オペパネアプリ161にジョブ一覧を通知する。オペパネアプリ161は、ステップS1311で、ユーザ160に、ジョブ一覧を通知(表示)する。
ステップS1312で、オペパネアプリ161は、ユーザ160からジョブ情報を要求される。ステップS1313で、オペパネアプリ161は、ジョブ管理モジュール26にジョブ情報の取得を要求する。ジョブ管理モジュール26は、ステップS1314で、プリンタアプリ20にジョブ情報の取得を要求する。プリンタアプリ20は、ステップS1315で、ジョブ管理モジュール26にジョブ情報を通知する。
ステップS1316で、ジョブ管理モジュール26は、プリンタアプリ20に、キューの順番取得を要求する。プリンタアプリ20は、ステップS1317で、ジョブ管理モジュール26にキューの順番を通知する。ジョブ管理モジュール26は、ステップS1318で、オペパネアプリ161にジョブ情報を通知する。ステップS1319で、オペパネアプリ161は、ユーザ160にジョブ情報を通知(表示)する。
次に、図58を用いて、ユーザからジョブを中止された場合の処理について説明する。ステップS1401で、オペパネアプリ161は、ユーザ160からジョブの中止を通知される。オペパネアプリ161は、ステップS1402で、ジョブ管理モジュール26にジョブの中止を通知する。ジョブ管理モジュール26は、ステップS1403で、プリンタアプリ20に印刷要求の中止を通知する。
プリンタアプリ20は、ステップS1404でメモリ管理モジュール30にジョブ情報の取得を要求し、ステップS1405で、中止処理を行う。プリンタアプリ20は、ステップS1406で、印刷制御モジュール23に印刷処理の中止を通知する。
印刷制御モジュール23は、ステップS1407で、メモリ管理モジュール30にジョブ情報の取得を要求し、ステップS1408で、中止処理を行う。印刷制御モジュール23は、ステップS1409で、プロッタハンドラ27にプロットの中止を通知する。プロッタハンドラ27は、ステップS1410で、メモリ管理モジュール30にジョブ情報の取得を要求し、ステップS1411で、中止処理を行う。
次に、図59を用いて、ユーザからジョブの再実行を要求された場合の処理について説明する。ステップS1501で、オペパネアプリ161は、ユーザ160からジョブの再実行が通知される。オペパネアプリ161は、ステップS1502で、ジョブ管理モジュール26にジョブの再実行を通知する。ジョブ管理モジュール26は、ステップS1503で、プリンタアプリ20に印刷再要求を通知する。プリンタアプリ20は、ステップS1504で、メモリ管理モジュール30にジョブ情報の取得を要求する。メモリ管理モジュール30は、ステップS1505で、プリンタアプリ20にジョブ情報を通知する。
プリンタアプリ20は、ステップS1506で、ジョブ情報を変更し、ステップS1507で、メモリ管理モジュール30にジョブ情報を通知することで、ジョブ情報を保存する。ステップS1508は、プリンタアプリ20の処理の実行である。
プリンタアプリ20は、ステップS1509で、印刷制御モジュール23に印刷処理の再実行を通知する。印刷制御モジュール23は、ステップS1510で、メモリ管理モジュール30にジョブ情報の取得を要求する。メモリ管理モジュール30は、ステップS1511で、印刷制御モジュール23にジョブ情報を通知する。印刷制御モジュール23は、ステップS1512で、ジョブ情報を変更し、ステップS1513で、メモリ管理モジュール30にジョブ情報を通知することで、ジョブ情報を保存する。ステップS1514は、印刷制御モジュール23の処理の実行である。
ステップS1515で、印刷制御モジュール23は、プロッタハンドラ27にプロット再実行を通知する。プロッタハンドラ27は、ステップS1516で、メモリ管理モジュール30にジョブ情報の取得を要求する。メモリ管理モジュール30は、ステップS1517で、印刷制御モジュール23にジョブ情報を通知する。印刷制御モジュール23は、ステップS1518で、ジョブ情報を変更し、ステップS1519で、メモリ管理モジュール30にジョブ情報を通知することで、ジョブ情報を保存する。ステップS1520は、プロッタの実行である。
プロッタハンドラ27は、印刷制御モジュール23に、ステップS1521で、プロット終了を通知する。印刷制御モジュール23は、ステップS1522で、プリンタアプリ20に印刷終了を通知する。プリンタアプリ20は、ステップS1523で、オペパネアプリ161に印刷終了を通知する。
以上がMFP内部の処理に関する説明である。次に、MFPの連携とユーザインタフェース(以下、UIと記す)について説明する。MFPの連携とは、例えば、通信可能な2台のMFPにおいて、一方のMFPがカラーページ印刷し、他方のMFPが白黒ページを印刷するように、複数のMFPが1つの根幹ジョブから派生したジョブを分担して実行することをいう。
まず、UIから説明することにする。図60は、オペレーションパネルまたはパソコンの画面に表示されるUI200である。このUI200は、図に示されるように、ジョブ情報とジョブのジョブ構造を一度に表示する場合のUIである。この図60に示されるように、このUIには、ジョブ同士の関係が木構造を用いて明示される。
UI200には、2つのジョブ構造201、202が表示されている。ジョブ構造201には、ジョブIDが1から6までのジョブが表示され、ジョブ構造202には、ジョブIDが7から9までのジョブが表示されている。これらのジョブのうち、ジョブ1、7が根幹ジョブで、ジョブ4、5、6、8、9が末端ジョブである。
またジョブ情報には、図20または図21で説明したジョブ情報が表示されている。このジョブ情報には、図に示されるように、種別や状態、オーナー名などが表示されるので、各ジョブ情報が一目で分かるようになっている。
次に、図61を用いて、他のUIの例を説明する。図61に示されるUI220は、MFP210のジョブのジョブ構造が示されているものである。このUI220は、カーソルで、ジョブを選択すると、選択されたジョブの情報が表示されるものである。
図61には、印刷ジョブ212がカーソル211で選択され、選択された印刷ジョブ212のジョブ情報213が、下部に表示される様子が示されている。また、このUI220は、さらにジョブ情報の編集、ジョブの再開、中止が可能となっている。それらは、編集ボタン214、再開ボタン215、中止ボタン216で行うことができる。なお、編集とは、ジョブ情報の編集であり、再開とは、停止していたジョブの実行を再び開始することであり、中止とは、ジョブの実行を中止することである。
このように、UI200、220は、ジョブのジョブ構造ならびにジョブ情報が分かりやすく表示されるものである。
次に、上述したUI200、220で、実際にジョブの実行を中止する場合のUIについて説明する。まず、UI200の場合について、図62、63、64を用いて説明する。図62には、エラーが発生しているジョブ3が示されている。ジョブ3の処理の実行を中断するユーザは、このジョブ3のジョブ情報230にカーソル211をあわせ、例えば右クリックする。
右クリックにより、図63に示されるUIとなる。このUIには、図に示されるように、ジョブに対して実行可能な操作項目であるメニュー231が表示されている。メニュー231には、「ジョブの中止」と、「ジョブの再開」と、「ジョブ情報編集」と、「プロパティ」が表示される。このとき、メニュー231のジョブの中止にカーソル221をあわせ、例えば左クリックする。
これにより、ジョブ3の処理の実行が中止され、図64に示されるように、ジョブ3が表示されなくなる。
次に、UI220の場合について、図65、66、67、68を用いて説明する。図65には、エラーが発生しているプロッタジョブ240が示されている。このプロッタジョブ240の処理の実行を中断するユーザは、このプロッタジョブ240にカーソル211をあわせ、例えば左クリックする。
この左クリックによって、図66に示されるように、ジョブ情報241と、中止ボタン242などが表示される。そこで、図67に示されるように、プロッタジョブ240の処理の実行を中断するユーザは、中止ボタン242にカーソル211をあわせ、例えば左クリックする。
これにより、プロッタジョブ240の処理の実行が中止され、図68に示されるように、プロッタジョブ240が表示されなくなる。
次に、MFPの連携について説明する。図69は、MFPの連携を示す図である。図69には、ユーザ160と、PC250と、ネットワーク253と、MFPA251と、MFPB252とが示されている。PC250と、MFPA251と、MFPB252は、ネットワーク253で接続され、通信可能である。
この構成で、例えばユーザ160がPC250からMFPA251に、カラーと白黒が混在したページを有する文書の印刷を要求したとする。この場合、MFPA251は、自らが白黒ページを印刷するとともに、MFPB252にカラーページの印刷要求をし、MFPB252がカラーページを印刷する。
この処理におけるジョブ構造は、図10で説明したジョブ構造である。このようにジョブのジョブ構造が複数のMFPにまたがって発生した場合、図70に示されるような、ジョブを管理するジョブ管理サーバを用意すると、ネットワーク上にある全体のジョブのジョブ構造を管理することが可能になる。
図70は、2台のMFPと、ジョブ管理サーバ280が設けられた構成が示されている。ジョブ構造テーブル282は、MFPA251で実行されているジョブのジョブ構造テーブルであり、ジョブ構造テーブル283は、MFP252で実行されているジョブのジョブ構造テーブルである。
これら2つのジョブ構造テーブルを各MFPがジョブ管理サーバ280に通知することにより、ジョブ管理サーバ280は、取得したジョブのジョブ構造テーブルを結合し、ネットワーク上にある全体のジョブのジョブ構造テーブル284を作成することができる。このときのジョブ構造テーブルを取得する処理が、ジョブ構造情報取得段階に対応する。なお、ジョブ構造情報取得手段は、上述したようにMFPであればオペパネアプリであってもよいし、パソコンであれば、HTMLブラウザであってもよい。また、ジョブ構造テーブルとともに、ジョブ情報を取得しても良い。
以上の処理は、ジョブ構造テーブルを受信し、ジョブ構造テーブルに基づいたグラフィカルユーザインタフェースを表示する処理である。
このようにジョブを管理することにより、ジョブ管理サーバ280に表示される管理画面には、図71に示されるUI290を表示することができる。このUI290には、MFPA251とMFPB252のジョブと、上述したジョブ情報213と、編集ボタン214、再開ボタン215、中止ボタン216とが表示される。ジョブ情報213は、カーソル211があっている印刷ジョブ212のジョブ情報である。
このUI290は、MFPB252のジョブであることを明示するために、根幹ジョブである印刷ジョブ212から派生し、MFPB252のジョブは、例えば点線286で囲まれるようになっている。
このようなUI上で、MFPに属するジョブを、他のMFPで実行させる場合のUIについて説明する。図72に示されるUIには、MFPA251で実行されている印刷ジョブから派生したジョブが表示されている。これらのジョブのうち、カラープリントジョブ294を、MFPB252で実行することとする。
この場合、図73に示されるように、カラープリントジョブ294をMFPB252のアイコンにドラッグする。この場合、アイコン295に示されるように、カラープリントジョブ294をドラッグすれば、カラープリントジョブ294の子ジョブも一緒にドラッグされる。
そして、図74に示されるように、ドラッグされたカラープリントジョブ295と、その子ジョブが、MFPB252のジョブとして表示される。
このように、ユーザの指示により、ジョブが属する機器を変更することができる。
以上説明したようなネットワークを介したMFPを利用すると、あるMFPでエラーが発生したジョブを他のMFPで処理し、エラーを回避するということなどが可能となる。
次に、ジョブ構造のいろいろな表示方法について説明する。まず、図75を用いて、根幹ジョブのみを表示するUIについて説明する。図75に示されるUIは、図60で説明したジョブのうち、根幹ジョブのみを表示したものである。図60にしめされるジョブ構造の根幹ジョブは、ジョブ1と、ジョブ7の2つのジョブである。従って、図75に示されるUIには、ジョブ1とジョブ7のジョブ情報が表示される。
次に、末端ジョブのみを表示するUIについて説明する。図76に示されるUIは、図60で説明したジョブのうち、末端ジョブのみを表示したものである。図60にしめされるジョブ構造の末端ジョブは、ジョブ4、ジョブ5、ジョブ6、ジョブ8、ジョブ9の5つのジョブである。従って、図76に示されるUIには、上記5つのジョブ情報が表示される。
次に、ジョブの一覧を表示するUIについて説明する。図60に示されるUIは、ジョブをツリー構造で表示するものであった。図77に示されるUIは、ツリー構造ではなく、一覧として表示するUIを示すものである。
図77のUIには、図60に示される全てのジョブが一覧として表示されている。一覧として表示されるため、このUIは、各項目ごとにソートをかけることが可能なUIである。例えば、オーナー名でソートをかけると、そのオーナーが要求したジョブについて一目瞭然となる。
また、図77のUIでは、検索を行うことができる。そのことを、図78を用いて説明する。図78には、検索条件画面700と、検索対象ラジオボタン701と、検索文字列入力欄702と、検索ボタン703と、キャンセルボタン704とが表示されている。
検索対象ラジオボタン701は、検索対象の項目を選択するためのラジオボタンである。この図では、項目として「状態」が選択されている。検索文字列702は、検索する文字列が入力されるテキストボックスである。この図では、文字列として「待機中」が入力されている。検索ボタン703は、選択された検索対象と、入力された文字列に基づき検索を実行させるボタンである。キャンセルボタン704は、何もせず、この検索条件画面700を閉じるためのボタンである。
この検索条件画面700により、対象となるジョブを検索することができる。このような検索が可能であるのは、MFP内で、ジョブ構造テーブルが作成されているからである。
検索ボタン703をユーザがクリックすると、図79に示される検索結果を示すUIが表示される。図77において、状態が待機中のジョブは、ジョブ5とジョブ9であり、それらのジョブが、図79のUIに表示されている。