- ベストアンサー
一定間隔のタスク処理について
現在、一定期間のタスク処理について悩んでいます。 あるプログラムをタスクトレイに常駐させています。 このプログラムは、DBにアクセスするプログラムで、15分間隔でDBにアクセスしようとしています。 当初は、 1.タイマーイベントで処理する。 2.Windowsのタスクを使用する。 と考えていたのですが、 1.タイマーのインターバル(最大)は、約65000で 15分は設定できない。 2.タスクは、プログラムが常駐している為、初回 実行のみ行われる。(つまりずっとタスク実行中 となる。) という問題にぶつかってしまいました。 何か良い方法はないでしょうか? http://oshiete1.goo.ne.jp/kotaeru.php3?q=571156 なども参考にはしてみたのですが・・・ どうかよろしくお願い致します。
- みんなの回答 (14)
- 専門家の回答
質問者が選んだベストアンサー
あくまで個人的意見 カウント形式は好きくない。 タイマーイベントが発生したら、 前回実行から15分以上経過しているかどうかで 判断する方が好き。 割り込み系プログラムの基本ダワサ
その他の回答 (13)
- 2ch
- ベストアンサー率51% (64/125)
>CとCOBOL 間違い Cとアセンブラだった >人のところで論争するつもりもないんですがね。 なら、なぜカウンタにこだわる?不思議だ。
- yomo3
- ベストアンサー率32% (88/269)
あのね、専門家の方に刃向かうつもりは全くないのですが、6001なんていう8bit出されたら困っちゃいますね。 そんなころは、私でも時刻取得していましたよ。time$をシリアル値に変換するとか、越年とか閏年とかいろいろありましたよね。 私が言ってるのは、BASICの話ではなく、MS-DOSの疑似マルチタスクの話です。 CでもCOBOLでもなく、アセンブラ。 640KBのメモリ空間の最上位パラグラフに常駐させるプログラムです。標準実装128KBなんて言う時代ですから、常駐サイズを極力減らして、割り込み時のクロック数もできるだけ減らして、というときの話です。 まあ、人のところで論争するつもりもないんですがね。 おっしゃるとおり素人と玄人の違いでしょうな。
- 2ch
- ベストアンサー率51% (64/125)
>98 98どうこうの話じゃ無いと思うのだが、、、 6001をやってた頃(ゲーム中心)、時計を作るプログラムと、タイマを作るプログラムは違っていた。 この時もやはり、タイマは経過時間を取得していた。 時計を作るプログラムは、ハードの時間を読み取るのは反則なので、カウンタを使用していた。 しかしそれはあくまで練習問題用であって、実務的ではない。 N88ベーシックを使用するOSは、そもそもマルチタスク? んなわきゃ無い。 割り込みを発生させるのは、ハードからじゃないと出来ないはず。 よってCOBOLの話になる。 >昔からそうらしいです。 というのは、そもそもこの時代の事からのこと。 電気メータもUPSも、主にCとCOBOLで開発されている。 練習問題の本と、実務アルゴリズムの本では、違う。
- yomo3
- ベストアンサー率32% (88/269)
#2,#3,#6です。 まだ、閉店してなかったんですね。ここ。 過去の書き込みを覗いていたら、ここに行き当たったんです。で、カウンタ派の言い訳を考えてたことを思い出したので、ついつい書き込んでしまいました。 カウンタを使って長時間のタイマを設定するやり方はプログラム入門の本に書いてあるから素人プログラマが多用することになっているのですが、カウンタ使用が多用されるようになったのは、NEC:PC9801系のマシン語プログラムからだと思うのです。 NEC:PC9801には、ハード割り込みにタイマ割り込みがありますが、常駐プログラムに使うには色々と支障があったので、VSYNC割り込み(画面表示用の1/60秒ごとに発生する割り込み)を使用することが多かったのです。 当時のパソコンは今と比べるとカメのように遅かったので、時刻取得BIOS呼び出しも、結構時間がかかるので、できるだけ使わないようにコーディングしなければなりませんでした。 タイマが1/60の固定ですから、それを「数える」しか方法がないということで登場したのが、カウンタ方式です。 汎用機故の工夫だったのです。 今となってはもはやそんなことまで考える必要はなく、専門機と同じように時刻比較の方が正確に時間が計れるのでしょうが、なかなか昔の癖は抜けないのですな。
お礼
閉店してたつもりだったのですが、まだ生きてましたね。申し訳ございませんでした。 PC9801、なつかしいですね。 あの頃はプログラムなんて全くわからなく、ベーマガのサンプルをよく打ち込んでいました。 ま、SyntaxErrorばかりでしたが(笑) 今回はどうもありがとうございました。
- Seiryo
- ベストアンサー率13% (27/203)
2番はプログラムを終了させるわけにはいかないのかな? どうでもいいけど・・。解決策はもうでていることでしょうから 自分の思うように動くようにがんばってください。 一応前の投稿に名前があったから記念カキコ
- 2ch
- ベストアンサー率51% (64/125)
書き込みワショーイ 電気ブレーカー じゃなく 企業向け電気メーターだった。 家庭用なら、家の横についてる(時々おばちゃんが見にくる)やつ。 でも一般家庭用は、時間の概念がないから、割り込みタイマはついてないはず。
- taknt
- ベストアンサー率19% (1556/7783)
>プログラム常駐は12時間行う予定なのですが、上記 >方法をとった場合、負荷は大丈夫でしょうか? 私が記載した手段を用いた場合、メモリリークなど発生しません。 どちらかというと、その15分の時の処理をどのように 記述するのかが問題です。
- 2ch
- ベストアンサー率51% (64/125)
多くの電気ブレーカーは割り込み機能を持っています。 大手のメーカの商品は、全てカウンタではやってません。 昔からそうらしいです。 UPSも割り込み機能を持っています。 大手のメーカの商品は、全てカウンタではやってません。 昔からそうらしいです。 >現在時刻と前回実行時刻を比較するのはとても素晴らしい方法ですね。 私が考えたわけではありませんので、あまり喜べないのですが、、、ただ、、、 大手のメーカの割り込みを発生させる商品は、全てカウンタではやってません。 昔からそうらしいです。
- yomo3
- ベストアンサー率32% (88/269)
三度#2です。 えと、時刻シリアル値の比較という答えがありましたが、非常に優れた方法だというのは認めます。が、負荷という意味では、ただの整数値のインクリメントとシリアル値(倍精度実数)の比較では大分差があります。まあ、クロックレベルの話なので、どうでもいいって言えばいいんですが。カウント派の意見です。 で、精度の問題が述べられていますが、マルチタスクである以上、完璧に設定通り実行させるのは不可能です。ものすごおくリソースを使うプログラムが動いていれば、間隔が開いてしまったりするからです。 この意味で、現在時刻と前回実行時刻を比較するのはとても素晴らしい方法ですね。 タイマー割り込みの間隔を短くすればするほど精度が上がります。 なので、時刻比較を使うのであれば、負荷とのバランスで割り込み間隔を使うといいと思います。
少々の誤差は問題にならないのであれば、タイマーでじゅうぶんでしょうが、高精度を求められるなら、別の方法がよいでしょうね。
- 1
- 2
お礼
色々と教えていただき、どうもありがとうございました。 今回は2chさんの案を採用させていただきます。