(57)【要約】【課題】  バックグランドスレッドにおいて、多くのメッセージをチェックする必要が無くなり、またタイムアップまでの間ＣＰＵを開放することができるようにする。【解決手段】  バックグランドスレッドにおいては、指定された時間、コンピュータのＣＰＵを開放するシステムコールを用いてタイマー機能を実現する。まず、符号１でループのたびに終了指示が出てないかチェックする。次に、符号２で「interval」で指定された時間、ＣＰＵ２０２を開放する。そして、符号３でタイムアップ時の処理を記述する。【選択図】  図２
2007011900.tif 000002
【特許請求の範囲】
【請求項１】
グラフィカルユーザインターフェースを有するオペレーティングシステムの機能をコンピュータに実行させるコンピュータが読み取り可能なプログラムにおいて、
バックグランドスレッドにおいては、指定された時間、コンピュータのＣＰＵを開放するシステムコールを用いてタイマー機能を実現することを特徴とするプログラム。
【請求項２】
グラフィカルユーザインターフェースを有するオペレーティングシステムの機能をコンピュータに実行させるコンピュータが読み取り可能なプログラムにおいて、
バックグランドスレッドにおいては、前記指定時間がタイムアップするか又は終了指示が出るまでの間コンピュータのＣＰＵを開放し、２値の同期オブジェクトのシグナル状態で前記終了指示を与えるようにして、このオブジェクトのシグナル状態を待つタイムアップ時間を用いてタイマー機能を実現することを特徴とするプログラム。
【請求項３】
前記バックグランドスレッドにおいては、前記終了指示を与える同期オブジェクトの他に別の処理指示用の同期オブジェクトを用い、前記の全オブジェクトの何れかのシグナル状態を待つタイムアウト時間を用いて前記タイマー機能を実現することを特徴とする請求項２に記載のプログラム。
【請求項４】
グラフィカルユーザインターフェースを有するオペレーティングシステムの機能をコンピュータに実行させるコンピュータが読み取り可能なプログラムにおいて、
バックグランドスレッドにおいては、タイマー機能を実現する基底クラスを予め定義しておき、このクラスからタイマー専用のクラスを個別に派生させて、前記派生クラスのメソッドでタイムアップ時の処理をオーバーライドしておき、前記派生クラスのインスタンスを生成させることによりタイマー機能を実現することを特徴とするプログラム。
【請求項５】
グラフィカルユーザインターフェースを有するオペレーティングシステムの機能をコンピュータに実行させるコンピュータが読み取り可能なプログラムにおいて、
バックグランドスレッドにおいては、タイマー機能を実現する基底クラスとタイマーとは別の機能を実現する基底クラスとを予め定義しておき、このクラスからタイマー専用のクラスや別の機能専用のクラスを個別に派生させて、前記派生クラスのメソッドでタイムアップ時の処理をオーバーライドしておき、前記派生クラスのインスタンスを生成させることによりタイマー機能を実現することを特徴とするプログラム。
【請求項６】
グラフィカルユーザインターフェースを有するオペレーティングシステムの機能をコンピュータに実行させるコンピュータが読み取り可能なプログラムにおいて、
バックグランドスレッドにおいては、タイマー機能を内部的に生成する別スレッドでタイマー機能を実現し、当該タイマーのタイムアップを２値の同期オブジェクトのシグナル状態で通知するようにして、前記タイマー機能を利用する側では、全タイマーの何れかがシグナル状態になった場合に対応する処理を実行することを特徴とするプログラム。
【請求項７】
グラフィカルユーザインターフェースを有するオペレーティングシステムの機能をコンピュータに実行させるコンピュータが読み取り可能なプログラムにおいて、
バックグランドスレッドにおいては、全タイマー機能を統括的に管理し、毎回最も近い次のタイムアップまでの時間を全体から算出してタイマー動作することで複数のタイマー機能を実現することを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、グラフィカルユーザインターフェース（ＧＵＩ（Graphical User Interface））を有するオペレーティングシステム（ＯＳ（Operating System））のプログラムに関し、特に、画面への更新を行わないバックグランドスレッド（ワーカースレッド）に於けるタイマー機能の改善に関する。
【背景技術】
【０００２】
ＧＵＩを有するＯＳに於いては、画面に対する操作を該当するプロセスに通知する仕組み（以下「メッセージ」と称する）を持っており、Windows（登録商標）等のＯＳでは、これをプロセス単位のキューに収めて順次処理することで様々なイベントを処理している。
ＯＳが提供するタイマー機能は、この「メッセージ」によってタイムアップを通知するので、画面の操作に対応した処理を行うスレッドに於いては、他の画面操作と同様の記述で容易に機能を利用できる。
しかしながら、この場合に画面への更新を行わないバックグランドスレッドに於いては、当該プロセスのメッセージキューからメッセージを取得してその中から該当するメッセージを判別し、無関係なメッセージをメッセージキューに戻す処理を独自にかつ個別に記述しなければならない。
図２９は、この従来技術に於ける構成としてWindows（登録商標）の例を説明するプログラムリストであり、図３０は、同フローチャートである。
この処理は、バックグランドスレッドに於いては、当該プロセスのメッセージキューからメッセージを取得してその中から該当するメッセージを判別し、無関係なメッセージをメッセージキューに戻すものである。
符号１でループのたびに終了指示が出てないかチェックしている（Ｓ３０１）。なお、「terminate」はグローバル変数にする等、外部（終了指示を出す箇所）から変更できなければならない。
符号２でプロセスのメッセージキュー内の総てのメッセージを取得している（Ｓ３０２）。そして、符号３で取得したメッセージが処理するタイマーのものか判別している（Ｓ３０３）。
そして、取得したメッセージが処理するタイマーのものであるときは（Ｓ３０３のＹ）、符号４でタイムアップ時の処理を記述する（Ｓ３０４）。また、そうでないときは（Ｓ３０３のＮ）、符号５で無関係なメッセージはメッセージキューに戻している（Ｓ３０５）。
【特許文献１】特開２００４−２３６４８０公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
しかし、前記の背景技術に於いては、当該プロセスのメッセージキューに収められる全てのメッセージをチェックする必要があり、それはまた、タイマー機能の利用が必要な箇所総てについて同様に行わなければならないので、実行するプログラムコードが長くなりがちであるという不具合がある。
また、メッセージキューをポーリングするため、ＣＰＵ時間を無駄に占有してしまうという不具合もある。
そこで、本発明の目的は、バックグランドスレッドにおいて、多くのメッセージをチェックする必要が無くなり、またタイムアップまでの間ＣＰＵを開放することができるようにすることである。
【課題を解決するための手段】
【０００４】
請求項１に記載の発明は、グラフィカルユーザインターフェースを有するＯＳの機能をコンピュータに実行させるコンピュータが読み取り可能なプログラムにおいて、バックグランドスレッドにおいては、指定された時間、コンピュータのＣＰＵを開放するシステムコールを用いてタイマー機能を実現することを特徴とする。
請求項２に記載の発明は、グラフィカルユーザインターフェースを有するオペレーティングシステムの機能をコンピュータに実行させるコンピュータが読み取り可能なプログラムにおいて、バックグランドスレッドにおいては、前記指定時間がタイムアップするか又は終了指示が出るまでの間コンピュータのＣＰＵを開放し、２値の同期オブジェクトのシグナル状態で前記終了指示を与えるようにして、このオブジェクトのシグナル状態を待つタイムアップ時間を用いてタイマー機能を実現することを特徴とする。
請求項３に記載の発明は、請求項２に記載のプログラムにおいて、バックグランドスレッドにおいては、前記終了指示を与える同期オブジェクトの他に別の処理指示用の同期オブジェクトを用い、前記の全オブジェクトの何れかのシグナル状態を待つタイムアウト時間を用いて前記タイマー機能を実現することを特徴とする。
請求項４に記載の発明は、グラフィカルユーザインターフェースを有するオペレーティングシステムの機能をコンピュータに実行させるコンピュータが読み取り可能なプログラムにおいて、バックグランドスレッドにおいては、タイマー機能を実現する基底クラスを予め定義しておき、このクラスからタイマー専用のクラスを個別に派生させて、前記派生クラスのメソッドでタイムアップ時の処理をオーバーライドしておき、前記派生クラスのインスタンスを生成させることによりタイマー機能を実現することを特徴とする。
請求項５に記載の発明は、グラフィカルユーザインターフェースを有するオペレーティングシステムの機能をコンピュータに実行させるコンピュータが読み取り可能なプログラムにおいて、バックグランドスレッドにおいては、タイマー機能を実現する基底クラスとタイマーとは別の機能を実現する基底クラスとを予め定義しておき、このクラスからタイマー専用のクラスや別の機能専用のクラスを個別に派生させて、前記派生クラスのメソッドでタイムアップ時の処理をオーバーライドしておき、前記派生クラスのインスタンスを生成させることによりタイマー機能を実現することを特徴とする。
請求項６に記載の発明は、グラフィカルユーザインターフェースを有するオペレーティングシステムの機能をコンピュータに実行させるコンピュータが読み取り可能なプログラムにおいて、バックグランドスレッドにおいては、タイマー機能を内部的に生成する別スレッドでタイマー機能を実現し、当該タイマーのタイムアップを２値の同期オブジェクトのシグナル状態で通知するようにして、前記タイマー機能を利用する側では、全タイマーの何れかがシグナル状態になった場合に対応する処理を実行することを特徴とする。
請求項７に記載の発明は、グラフィカルユーザインターフェースを有するオペレーティングシステムの機能をコンピュータに実行させるコンピュータが読み取り可能なプログラムにおいて、バックグランドスレッドにおいては、全タイマー機能を統括的に管理し、毎回最も近い次のタイムアップまでの時間を全体から算出してタイマー動作することで複数のタイマー機能を実現することを特徴とする。
【発明の効果】
【０００５】
請求項１に記載の発明によれば、多くのメッセージをチェックする必要が無くなり、またタイムアップまでの間ＣＰＵを開放することができる。
請求項２に記載の発明によれば、任意のタイミングでタイマー機能を終了することができる。
請求項３に記載の発明によれば、別処理指示用の同期オブジェクトをシグナル状態にすることで、タイムアップ時の処理以外の処理を行うことができる。
請求項４に記載の発明によれば、タイマー機能を利用するのに必要なコードが簡略化できる。また、タイマークラスを実現する基底クラスから子クラスを単純に派生させ、タイムアップ時に実行されるメソッドの中身のみを同子クラス側で追加記述すればよいので、関数のインターフェイス仕様に煩わされることが無い。
請求項５に記載の発明によれば、タイマー機能を利用するのに必要なコードが簡略化できる。また、タイマークラス等を実現する基底クラスから子クラスを単純に派生させ、タイムアップ時に実行されるメソッドの中身のみを同子クラス側で追加記述すればよいので、関数のインターフェイス仕様に煩わされることが無い。
請求項６に記載の発明によれば、タイムアップ時の処理自体はタイマー機能の利用側に記述できるので、タイムアップ時の処理毎に子クラスを派生する必要は無くなり、記述が簡便になる。
請求項７に記載の発明によれば、タイマー機能関連で生成する別スレッドの全体数を、使用するタイマー機能の数に関わらず１つにすることができる。
【発明を実施するための最良の形態】
【０００６】
以下、発明を実施するための最良の形態について説明する。
図１は、本実施形態のプログラムが動作する情報処理装置であるＰＣ（Personal Computer）２０１の電気的な接続を説明するブロック図である。図１に示すように、ＰＣ２０１は、各種演算を行いＰＣ２０１の全体を集中的に制御するＣＰＵ２０２と、各種のＲＯＭ、ＲＡＭから構成されるメモリ２０３とがバス２０４で接続されている。
さらに、バス２０４には、磁気記憶装置（ＨＤＤ：Hard Disk Drive）２０５と、ＬＣＤなどの表示装置２０６と、キーボード、マウスなどの入力装置２０７と、記憶媒体２０８に記録されているデータを読み取る記憶媒体読取装置２０９と、インターネットなどのネットワーク２１０と通信を行う通信制御装置２１１と、が接続されている。記憶媒体読取装置２０９は、具体的には、記憶媒体２０８がいずれのメディアであるか（ＤＶＤ、ＣＤ、フレキシブルディスクなどのうちいずれであるか）により、ＤＶＤドライブ装置、ＣＤドライブ装置、フレキシブルディスクドライブ装置などが用いられる。
ＰＣ２０１は、Windows（登録商標）などのＯＳとなるプログラムを、記憶媒体読取装置２０９により記憶媒体２０８から読み取るか、インターネットなどのネットワーク２１０からダウンロードして、ＨＤＤ２０５にインストールすることにより、動作可能な状態となる。
以下では、このＯＳとなるプログラムが実行する特徴的な処理の内容について複数例説明する。
このＯＳは、ＧＵＩを有するものであり、以下では、Windows（登録商標）の例（実施形態４はＭＦＣも）について複数例（実施形態１〜７）説明する。このＯＳの特徴的な処理は、バックグランドスレッドにおけるタイマー機能に関するものである。
【０００７】
［実施形態１］
図２は、本実施形態を説明するプログラムリストであり、図２１は、同フローチャートである。この処理は、バックグランドスレッドにおいて実行する。
まず、符号１でループのたびに終了指示が出てないかチェックする（Ｓ１１）。なお「terminate」は論理型の変数で、グローバルにする等、外部（終了指示を出す箇所）から変更できなければならない。
次に、符号２で「interval」で指定された時間、ＣＰＵ２０２を開放する（Ｓ１２）。なお「interval」を可変にする場合は、グローバル変数にする等、外部（終了指示を出す箇所）から設定できなければならない。固定にする場合は定数で構わない。そして、符号３でタイムアップ時の処理を記述する（Ｓ１３）。
このように、本処理では、バックグランドスレッドにおいて、指定された時間、ＣＰＵ２０２を開放するシステムコール「Wait」を用いてタイマー機能を代替するものである。
［実施形態２］
図３は、本実施形態を説明するプログラムリストであり、図２２は、同フローチャートである。この処理は、バックグランドスレッドにおいて実行する。
実施形態１の例はタイマーの間隔でしかタイマー機能を終了できないので、この点を改良したのが本実施形態である。
まず、符号１で終了指示が出るかタイムアップするまでＣＰＵ２０２を開放する（Ｓ２１〜Ｓ２４）。なお、「terminate」は２値の同期オブジェクト（図３ではＭＦＣのCEventを想定）でなければならず、また、グローバルにする等、外部（終了指示を出す箇所）から変更できなければならない。タイムアップまでの時間は「interval」が規定するので、可変にする場合は、グローバル変数にする等、外部（終了指示を出す箇所）から設定できなければならない。
また、符号２で終了指示に従ってループを離脱している（Ｓ２４のＹ）。符号３でタイムアップ時の処理を記述する（Ｓ２５）。
【０００８】
［実施形態３］
図４は、本実施形態を説明するプログラムリストであり、図２３は、同フローチャートである。この処理は、バックグランドスレッドにおいて実行する。
実施形態１の例はタイムアップまでの間にタイマー機能を終了する以外の処理を行うことができないので、この点を改良したのが本実施形態である。
まず、符号１で、終了指示が出るかタイムアップするか（Ｓ３１〜Ｓ３４）、それ以外の処理の指示が出るまで（Ｓ３５、Ｓ３６）、ＣＰＵ２０２を開放する。なお、「terminate」、「sigProcA」、「sigProcB」は２値の同期オブジェクト（図４ではＭＦＣのCEventを想定）でなければならず、また、グローバルにする等、外部（終了指示を出す箇所）から変更できなければならない。タイムアップまでの時間は「interval」が規定するので、この時間を可変にする場合は、グローバル変数にする等、外部（終了指示を出す箇所）から設定できなければならない。固定にする場合は定数で構わない。
符号２では終了指示に従ってループを離脱する（Ｓ３４のＹ）。符号３では「sigProcA」がシグナル状態になったときに実行する処理を記述する（Ｓ３５のＹ、Ｓ３８）。符号４では「sigProcB」がシグナル状態になったときに実行する処理を記述する（Ｓ３６のＹ、Ｓ３９）。符号５ではタイムアップ時の処理を記述する（Ｓ３７のＹ、Ｓ４０）。
本実施形態では、実施形態２における同期オブジェクトの他に別の処理（処理Ａ、Ｂ）指示用の同期オブジェクトを用い、全オブジェクトの何れかのシグナル状態を待つタイムアウト時間を用いてタイマー機能を実現している。
【０００９】
［実施形態４］
図５〜図７は、本実施形態を説明するプログラムリストであり、図２４は、同フローチャートである。図７はタイマー機能を利用する側の処理を示すものである。これらの処理は、バックグランドスレッドにおいて実行する。
実施形態２では、タイマー機能を必要とする箇所総てにタイマー機能を実現するためのコードを記述しなければならず、また、タイムアップ時に実行する処理がタイマー機能を実現するコードに埋め込まれていて分かり難い。
また、実施形態２を、タイマー機能を実現する関数とタイムアップ時に実行する関数とで構成した場合、タイマー機能は同関数の呼び出しのみで記述が簡略化でき、タイムアップ時に実行する処理もタイマー機能から分離できるが、タイマー機能のユーザーはタイマー機能の関数で定められた関数仕様に合わせて（関数仕様を理解して）タイムアップ時に実行する関数を独自に定義しなくてはならない。
そこで、これらの不具合を解消したのが本実施形態である。
まず、符号１はタイマー機能を実現する基底クラスである。符号２はタイマーの間隔を変更するメソッドである。符号３はタイマーの終了を指示するメソッドである。符号４はタイマーの終了指示に用いられる２値の同期オブジェクト（図５ではＭＦＣのCEventを想定）である。符号５はタイマーを動作させる際に呼び出すメソッドである。エラーが発生するか終了指示が出されると、メソッドが終了する（Ｓ４２〜Ｓ４４）。符号６で終了指示が出るかタイムアップするまで（Ｓ４５、Ｓ４６）ＣＰＵ２０２を開放している。符号７でタイムアップ時の処理を実行している（Ｓ４７）。そして、符号８でタイムアップ以外の総ての事象でメソッド「Excute」を終了している。
符号９はタイマー機能を実現する基底クラスから個々の処理向けに派生された子クラスである。符号１０がタイムアップ時の処理を記述するメソッドである。符号１１にタイムアップ時の処理を記述する。
符号１２では、個別のタイマー機能を実行している。図７ではタイマーのインスタンスをローカルに生成しているが、終了指示を行う必要がある場合はタイマーのインスタンスそのものをグローバルにする等、外部(終了指示を出す箇所)から終了指示メソッドを呼び出せなければならない。符号１３では、終了指示に従ってループを離脱している。
【００１０】
［実施形態５］
図８〜図１１は、本実施形態を説明するプログラムリストであり、図２５は、同フローチャートである。図１１はタイマー機能を利用する側の処理を示すものである。これらの処理は、バックグランドスレッドにおいて実行する。
実施形態３では、タイマー機能を必要とする箇所総てにタイマー機能を実現するためのコードを記述しなければならず、また、タイムアップ時に実行する処理がタイマー機能を実現するコードに埋め込まれていて分かり難い。
また、実施形態３を、タイマー機能を実現する関数とタイムアップ時に実行する関数とで構成した場合、タイマー機能は同関数の呼び出しのみで記述が簡略化でき、タイムアップ時に実行する処理もタイマー機能から分離できるが、タイマー機能のユーザーはタイマー機能の関数で定められた関数仕様に合わせて（関数仕様を理解して）タイムアップ時に実行する関数を独自に定義しなくてはならない。
そこで、これらの不具合を解消したのが本実施形態である。
【００１１】
まず、符号１はタイマー機能を実現する基底クラスである。実施形態４の例である「TimerBaseSingle」を継承しても良い。符号２はタイマーの間隔を変更するメソッドである。符号３はタイマーの終了を指示するメソッドである。符号４はタイマーの終了指示に用いられる２値の同期オブジェクト（図８ではＭＦＣのCEventを想定）である。
符号５は終了指示及び他の処理に対応する同期オブジェクトへのシグナル状態確認手段を提供する（各オブジェクトへのハンドルを配列で格納する）（Ｓ５１）。
符号６はタイマーを動作させる際（Ｓ５２）に呼び出すメソッドである。エラーが発生するか終了指示が出されると（Ｓ５３、Ｓ５９）、メソッドが終了する。
符号７で終了指示が出るかタイムアップするまでＣＰＵ２０２を開放している（Ｓ６１、Ｓ６２）。符号８でタイムアップ時の処理を実行している（Ｓ６３）。
符号９でタイムアップ以外の総ての事象でメソッド「Excute」を終了している（Ｓ６２のＮ）。符号１０はタイムアップ時の処理以外の処理に対応させる実行指示用の同期オブジェクトを登録するメソッドである（Ｓ５１）。
符号１１はタイマー機能を実現する基底クラスから個々の処理向けに派生させた子クラスである。符号１２は、タイムアップ時の処理を記述するメソッドである。符号１３はタイムアップ時の処理を記述する。
符号１４でタイムアップ時の処理以外の処理に対応させる実行指示用の同期オブジェクトを登録している。図１１ではこれらの同期オブジェクトをローカルに生成しているが、インスタンスそのものをグローバルにする等、外部（終了指示を出す箇所）から終了指示メソッドを呼び出せなければならない。また、タイマーのインスタンスをローカルに生成しているが、終了指示を行う必要がある場合はタイマーのインスタンスそのものをグローバルにする等、外部(終了指示を出す箇所)から終了指示メソッドを呼び出せなければならない。符号１５は個別のタイマー機能を実行している。
符号１６は「sigProcA」がシグナル状態となった場合（Ｓ５５のＹ）に実行する処理を記述する（Ｓ５７）。符号１７は「sigProcB」がシグナル状態となった場合（Ｓ５６のＹ）に実行する処理を記述する（Ｓ５８）。符号１８はで終了指示に従ってループを離脱している（Ｓ５９のＹ）。
【００１２】
［実施形態６］
図１２〜図１６は、本実施形態を説明するプログラムリストであり、図２６、図２７は、同フローチャートである。図１５と図１６がタイマー機能を利用する側で、図１５がタイムアップ時の処理（及びタイマー終了処理）にのみ対応した場合、図１６がタイムアップ時の処理とタイマー終了処理以外の処理にも対応した場合の構成である。なお、図２６において、（ａ）はタイマー機能だけを実行させる例を示し、（ｂ）はタイマー機能以外の機能を実行させる例で、実行指示としての同期オブジェクトをタイマーの同期オブジェクトと合わせて用いる例を示している。これらの処理は、バックグランドスレッドにおいて実行する。
実施形態４及び５では、タイムアップ時に実行する処理が呼び出し元ローカルなパラメータへのアクセスを必要とする場合、派生させる子クラスにて、コンストラクタのパラメータまたは追加のメソッドやデータメンバ等でアクセス手段を設けなければならない。
また、１つのスレッド当たり１つのタイマー機能しか利用できないので、ユーザーはタイマーの数だけのスレッドを自分で生成し、またそれを自分で管理するようコードを記述しなければならない。
そこで、これらの不具合を解消したのが本実施形態である。
【００１３】
符号１はタイマー機能を実現するクラスである。符号２はクラス「TimerEvent」が生成される時に自動的に生成されるスレッドが実行するメソッドである（Ｓ９２）。符号３はタイマーの終了を指示するメソッドである。符号４はタイマーの有効／無効を切り替えるメソッドである（Ｓ９５）。符号５はタイマーの間隔を変更するメソッドである。符号６はメソッド「CallExecute」が呼び出すメソッドで、タイマー機能本体を実現している（Ｓ９３）。符号７はタイマーの終了を指示するメソッドである（Ｓ９４）。符号８はタイムアップを通知するメソッドである（Ｓ１００）。符号９はタイマーの終了指示に用いられる変数である。符号１０はタイマー機能の有効／無効状態を制御する２値の同期オブジェクト（図１２ではＭＦＣのCEventを想定）である。
符号１１はタイマー機能を有効状態に設定している（Ｓ９８）。符号１２はタイマー状態を無効状態に設定している（Ｓ９５）。符号１３はタイマー機能を無効状態に設定してからタイマー間隔を変更している。符号１４はタイムアップするまでＣＰＵ２０２を開放している。符号１５はタイムアップ時の処理を実行している。符号１６はタイムアップでもタイマー状態の変更でもない総ての事象でメソッド「Excute」を終了している。符号１７は終了指示に従ってメソッド「Excute」を終了している（Ｓ９９）。符号１８はタイマー機能が有効状態になるまで、ＣＰＵ２０２を開放している（Ｓ９７、Ｓ９８）。符号１９はタイムアップでもタイマー状態の変更でもない総ての事象でメソッド「Excute」を終了している。符号２０は終了指示に従ってメソッド「Excute」を終了している（Ｓ９９）。
また、符号２１は、タイマーがタイムアップするまで（Ｓ７２、Ｓ８２）ＣＰＵ２０２を開放している。図１５ではタイマーのインスタンスをローカルに生成しているが、終了指示を行う必要がある場合はタイマーのインスタンスそのものをグローバルにする等、外部（終了指示を出す箇所）から終了指示メソッドを呼び出せなければならない。符号２２はタイムアップ時の処理を記述する（Ｓ７５、Ｓ８８）。
符号２３は、タイムアップ時の処理以外の処理（処理Ａ、Ｂ）に対応させる実行指示用の同期オブジェクトを登録している。図１６ではこれらの同期オブジェクトをローカルに生成しているが、インスタンスそのものをグローバルにする等、外部（終了指示を出す箇所）から終了指示メソッドを呼び出せなければならない。また、タイマーのインスタンスをローカルに生成しているが、終了指示を行う必要がある場合はタイマーのインスタンスそのものをグローバルにする等、外部（終了指示を出す箇所）から終了指示メソッドを呼び出せなければならない。
符号２４はタイムアップ通知及び他処理実行指示を待っている。符号２５はタイムアップ時の処理を記述する（Ｓ７５、Ｓ８８）。符号２６は「sigProcA」がシグナル状態となった場合に実行する処理を記述する（Ｓ８９）。符号２７は「sigProcB」がシグナル状態となった場合に実行する処理を記述する（Ｓ９０）。
【００１４】
［実施形態７］
図１５、図１６（前述の図面）、図１７〜図２０は、本実施形態を説明するプログラムリストであり、図２６（前述の図面）、図２８は、同フローチャートである。図１５と図１６がタイマー機能を利用する側で、図１５がタイムアップ時の処理（及びタイマー終了処理）にのみ対応した場合、図１６がタイムアップ時の処理とタイマー終了処理以外の処理にも対応した場合の構成である。なお、図２６において、（ａ）はタイマー機能だけを実行させる例を示し、（ｂ）はタイマー機能以外の機能を実行させる例で、実行指示としての同期オブジェクトをタイマーの同期オブジェクトと合わせて用いる例を示している。これらの処理は、バックグランドスレッドにおいて実行する。
実施形態６では、タイマー機能を使用する数だけ別スレッドが生成されるので、無駄であるという不具合がある。そこで、これらの不具合を解消したのが本実施形態である。
すなわち、符号１はタイマー機能を実現するクラスである。符号２はクラス「TimerEvent」が生成される時に自動的に生成されるスレッドが実行するメソッドで、タイマー機能本体を実現している（Ｓ１０３）。符号３はタイマーの有効／無効を切り替えるメソッドである（Ｓ１０６）。符号４はタイマーの間隔を変更するメソッドである。符号５はタイムアップを通知するメソッドである（Ｓ１１８）。符号６は当該タイマーオブジェクト自身が登録されている管理テープルのエントリである。符号７は当該タイマーの次のタイムアップ時刻である。符号８は全タイマーオブジェクトを統括的に管理する管理テーブルである。符号９は次のタイムアップ時刻の変更時（Ｓ１２１）に用いる再スタート指示用の２値の同期オブジェクト（図１７ではＭＦＣのCEventを想定）である。符号１０はタイマー機能の利用側と提供側の排他制御用の同期オブジェクト（図１７ではＭＦＣのCCriticalSectionを想定）である。
【００１５】
符号１１はタイマー全体で最短のタイムアップ時刻とそのためのタイムアップ時間である（Ｓ１２０、Ｓ１２１）。符号１２は、タイマー機能を実現するスレッドが未起動の場合に限って、同スレッドを起動している（Ｓ１０２、Ｓ１０３）。符号１３は管理テーブルの空きエントリを探索して自分自身を登録している（Ｓ１０４、Ｓ１０５）。符号１４は当該タイマーが次にタイムアップする時刻を設定している（Ｓ１０７）。符号１５は、現状での次のタイムアップが当該タイマーの最初のタイムアップよりも先の場合に限って（Ｓ１０８）、タイムアップ時間を更新して再スタート指示を出している（Ｓ１０９）。符号１６でタイマーオブジェクトが破棄されるときに管理テーブルのエントリもクリアしている。符号１７はタイムアップするまでＣＰＵ２０２を開放している（Ｓ１１１〜Ｓ１１３）。
符号１８は、タイムアップしているタイマーオブジェクトの次のタイムアップ時刻を更新し（Ｓ１２０）、タイムアップ通知を行っている。符号１９は、最短のタイムアップ時刻のタイマーのタイマー間隔に次のタイムアップ時間を更新する（Ｓ１２１）。符号２０は有効タイマーが存在しない場合のタイムアップ時間として無限待ちを設定する（Ｓ１１５）。符号２１はタイムアップでも再スタート指示でもない場合はスレッドを終了する。符号２２は当該タイマーの次のタイムアップ時刻を更新している（Ｓ１２１）。符号２３は、現状での次のタイムアップが当該タイマーの最初のタイムアップよりも先の場合に限って、タイムアップ時間を更新して再スタート指示を出している（Ｓ１０８〜Ｓ１１０）。
【図面の簡単な説明】
【００１６】
【図１】本実施形態のプログラムが動作する情報処理装置であるＰＣの電気的な接続を説明するブロック図である。
【図２】実施形態１の処理を説明するプログラムリストを示す図である。
【図３】実施形態２の処理を説明するプログラムリストを示す図である。
【図４】実施形態３の処理を説明するプログラムリストを示す図である。
【図５】実施形態４の処理を説明するプログラムリストを示す図である。
【図６】実施形態４の処理を説明するプログラムリストを示す図である。
【図７】実施形態４の処理を説明するプログラムリストを示す図である。
【図８】実施形態５の処理を説明するプログラムリストを示す図である。
【図９】実施形態５の処理を説明するプログラムリストを示す図である。
【図１０】実施形態５の処理を説明するプログラムリストを示す図である。
【図１１】実施形態５の処理を説明するプログラムリストを示す図である。
【図１２】実施形態６の処理を説明するプログラムリストを示す図である。
【図１３】実施形態６の処理を説明するプログラムリストを示す図である。
【図１４】実施形態６の処理を説明するプログラムリストを示す図である。
【図１５】実施形態６、７の処理を説明するプログラムリストを示す図である。
【図１６】実施形態６、７の処理を説明するプログラムリストを示す図である。
【図１７】実施形態７の処理を説明するプログラムリストを示す図である。
【図１８】実施形態７の処理を説明するプログラムリストを示す図である。
【図１９】実施形態７の処理を説明するプログラムリストを示す図である。
【図２０】実施形態７の処理を説明するプログラムリストを示す図である。
【図２１】実施形態１の処理を説明するフローチャートである。
【図２２】実施形態２の処理を説明するフローチャートである。
【図２３】実施形態３の処理を説明するフローチャートである。
【図２４】実施形態４の処理を説明するフローチャートである。
【図２５】実施形態５の処理を説明するフローチャートである。
【図２６】実施形態６、７の処理を説明するフローチャートである。
【図２７】実施形態６の処理を説明するフローチャートである。
【図２８】実施形態７の処理を説明するフローチャートである。
【図２９】従来技術の処理を説明するプログラムリストを示す図である。
【図３０】従来技術の処理を説明するフローチャートである。
【符号の説明】
【００１７】
２０１  ＰＣ
２０２  ＣＰＵ
２０３  メモリ
【図１】
2007011900.tif 000003
【図２】
2007011900.tif 000004
【図３】
2007011900.tif 000005
【図４】
2007011900.tif 000006
【図５】
2007011900.tif 000007
【図６】
2007011900.tif 000008
【図７】
2007011900.tif 000009
【図８】
2007011900.tif 000010
【図９】
2007011900.tif 000011
【図１０】
2007011900.tif 000012
【図１１】
2007011900.tif 000013
【図１２】
2007011900.tif 000014
【図１３】
2007011900.tif 000015
【図１４】
2007011900.tif 000016
【図１５】
2007011900.tif 000017
【図１６】
2007011900.tif 000018
【図１７】
2007011900.tif 000019
【図１８】
2007011900.tif 000020
【図１９】
2007011900.tif 000021
【図２０】
2007011900.tif 000022
【図２１】
2007011900.tif 000023
【図２２】
2007011900.tif 000024
【図２３】
2007011900.tif 000025
【図２４】
2007011900.tif 000026
【図２５】
2007011900.tif 000027
【図２６】
2007011900.tif 000028
【図２７】
2007011900.tif 000029
【図２８】
2007011900.tif 000030
【図２９】
2007011900.tif 000031
【図３０】
2007011900.tif 000032