こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

一定間隔のタスク処理について

現在、一定期間のタスク処理について悩んでいます。
あるプログラムをタスクトレイに常駐させています。
このプログラムは、DBにアクセスするプログラムで、15分間隔でDBにアクセスしようとしています。

当初は、

 1.タイマーイベントで処理する。
 2.Windowsのタスクを使用する。

と考えていたのですが、

 1.タイマーのインターバル(最大)は、約65000で
   15分は設定できない。
 2.タスクは、プログラムが常駐している為、初回
   実行のみ行われる。(つまりずっとタスク実行中
   となる。)

という問題にぶつかってしまいました。
何か良い方法はないでしょうか?
http://oshiete1.goo.ne.jp/kotaeru.php3?q=571156
なども参考にはしてみたのですが・・・
どうかよろしくお願い致します。

投稿日時 - 2003-06-18 15:03:02

QNo.578496

困ってます

質問者が選んだベストアンサー

あくまで個人的意見

カウント形式は好きくない。

タイマーイベントが発生したら、
前回実行から15分以上経過しているかどうかで
判断する方が好き。


割り込み系プログラムの基本ダワサ

投稿日時 - 2003-06-18 15:50:48

ANo.4

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(14)

ANo.14

2ch

>CとCOBOL
間違い
Cとアセンブラだった

>人のところで論争するつもりもないんですがね。
なら、なぜカウンタにこだわる?不思議だ。

投稿日時 - 2003-06-24 16:36:23

ANo.13

あのね、専門家の方に刃向かうつもりは全くないのですが、6001なんていう8bit出されたら困っちゃいますね。
そんなころは、私でも時刻取得していましたよ。time$をシリアル値に変換するとか、越年とか閏年とかいろいろありましたよね。
私が言ってるのは、BASICの話ではなく、MS-DOSの疑似マルチタスクの話です。
CでもCOBOLでもなく、アセンブラ。
640KBのメモリ空間の最上位パラグラフに常駐させるプログラムです。標準実装128KBなんて言う時代ですから、常駐サイズを極力減らして、割り込み時のクロック数もできるだけ減らして、というときの話です。
まあ、人のところで論争するつもりもないんですがね。
おっしゃるとおり素人と玄人の違いでしょうな。

投稿日時 - 2003-06-24 15:18:08

ANo.12

2ch

>98
98どうこうの話じゃ無いと思うのだが、、、
6001をやってた頃(ゲーム中心)、時計を作るプログラムと、タイマを作るプログラムは違っていた。
この時もやはり、タイマは経過時間を取得していた。
時計を作るプログラムは、ハードの時間を読み取るのは反則なので、カウンタを使用していた。
しかしそれはあくまで練習問題用であって、実務的ではない。

N88ベーシックを使用するOSは、そもそもマルチタスク?
んなわきゃ無い。

割り込みを発生させるのは、ハードからじゃないと出来ないはず。
よってCOBOLの話になる。

>昔からそうらしいです。
というのは、そもそもこの時代の事からのこと。

電気メータもUPSも、主にCとCOBOLで開発されている。

練習問題の本と、実務アルゴリズムの本では、違う。

投稿日時 - 2003-06-24 13:15:46

お礼

色々と教えていただき、どうもありがとうございました。
今回は2chさんの案を採用させていただきます。

投稿日時 - 2003-06-24 21:21:15

ANo.11

#2,#3,#6です。
まだ、閉店してなかったんですね。ここ。
過去の書き込みを覗いていたら、ここに行き当たったんです。で、カウンタ派の言い訳を考えてたことを思い出したので、ついつい書き込んでしまいました。
カウンタを使って長時間のタイマを設定するやり方はプログラム入門の本に書いてあるから素人プログラマが多用することになっているのですが、カウンタ使用が多用されるようになったのは、NEC:PC9801系のマシン語プログラムからだと思うのです。
NEC:PC9801には、ハード割り込みにタイマ割り込みがありますが、常駐プログラムに使うには色々と支障があったので、VSYNC割り込み(画面表示用の1/60秒ごとに発生する割り込み)を使用することが多かったのです。
当時のパソコンは今と比べるとカメのように遅かったので、時刻取得BIOS呼び出しも、結構時間がかかるので、できるだけ使わないようにコーディングしなければなりませんでした。
タイマが1/60の固定ですから、それを「数える」しか方法がないということで登場したのが、カウンタ方式です。
汎用機故の工夫だったのです。
今となってはもはやそんなことまで考える必要はなく、専門機と同じように時刻比較の方が正確に時間が計れるのでしょうが、なかなか昔の癖は抜けないのですな。

投稿日時 - 2003-06-24 12:53:45

お礼

閉店してたつもりだったのですが、まだ生きてましたね。申し訳ございませんでした。

PC9801、なつかしいですね。
あの頃はプログラムなんて全くわからなく、ベーマガのサンプルをよく打ち込んでいました。
ま、SyntaxErrorばかりでしたが(笑)

今回はどうもありがとうございました。

投稿日時 - 2003-06-24 21:00:27

ANo.10

2番はプログラムを終了させるわけにはいかないのかな?
どうでもいいけど・・。解決策はもうでていることでしょうから
自分の思うように動くようにがんばってください。

一応前の投稿に名前があったから記念カキコ

投稿日時 - 2003-06-18 18:29:09

ANo.9

2ch

書き込みワショーイ


電気ブレーカー じゃなく 企業向け電気メーターだった。
家庭用なら、家の横についてる(時々おばちゃんが見にくる)やつ。
でも一般家庭用は、時間の概念がないから、割り込みタイマはついてないはず。

投稿日時 - 2003-06-18 17:14:39

ANo.8

>プログラム常駐は12時間行う予定なのですが、上記
>方法をとった場合、負荷は大丈夫でしょうか?

私が記載した手段を用いた場合、メモリリークなど発生しません。

どちらかというと、その15分の時の処理をどのように
記述するのかが問題です。

投稿日時 - 2003-06-18 16:58:19

ANo.7

2ch

多くの電気ブレーカーは割り込み機能を持っています。
大手のメーカの商品は、全てカウンタではやってません。
昔からそうらしいです。

UPSも割り込み機能を持っています。
大手のメーカの商品は、全てカウンタではやってません。
昔からそうらしいです。

>現在時刻と前回実行時刻を比較するのはとても素晴らしい方法ですね。
私が考えたわけではありませんので、あまり喜べないのですが、、、ただ、、、
大手のメーカの割り込みを発生させる商品は、全てカウンタではやってません。
昔からそうらしいです。

投稿日時 - 2003-06-18 16:41:48

ANo.6

三度#2です。
えと、時刻シリアル値の比較という答えがありましたが、非常に優れた方法だというのは認めます。が、負荷という意味では、ただの整数値のインクリメントとシリアル値(倍精度実数)の比較では大分差があります。まあ、クロックレベルの話なので、どうでもいいって言えばいいんですが。カウント派の意見です。
で、精度の問題が述べられていますが、マルチタスクである以上、完璧に設定通り実行させるのは不可能です。ものすごおくリソースを使うプログラムが動いていれば、間隔が開いてしまったりするからです。
この意味で、現在時刻と前回実行時刻を比較するのはとても素晴らしい方法ですね。
タイマー割り込みの間隔を短くすればするほど精度が上がります。
なので、時刻比較を使うのであれば、負荷とのバランスで割り込み間隔を使うといいと思います。

投稿日時 - 2003-06-18 16:19:38

ANo.5

少々の誤差は問題にならないのであれば、タイマーでじゅうぶんでしょうが、高精度を求められるなら、別の方法がよいでしょうね。

投稿日時 - 2003-06-18 15:51:44

ANo.3

悔しがりの#2です。
現実問題として、1分間隔の割り込みだとして、変数をインクリメントするだけですので、ほとんど問題ないはずです。
ただ、プログラム自体を呼び出すのにリソースを大分使ってしまうので、レスポンスには響くと思います。
やってみないとわかりませんが。

投稿日時 - 2003-06-18 15:49:56

ANo.2

VBの本にならどれにでも載っているはずですが、インターバルタイマーを連鎖させてカウントすればいいのです。
とここまで書いたら、#1の人がすでに書いていましたね。
悔しいので回答を送ってしまいます。
変数はグローバルで定義してください。

投稿日時 - 2003-06-18 15:22:30

補足

早速の回答(悔しい中送っていただき)、ありがとうございます。
ところでプログラム常駐は12時間行う予定なのですが、上記方法をとった場合、負荷は大丈夫でしょうか?

投稿日時 - 2003-06-18 15:40:12

ANo.1

タイマーのインターバルは たとえ 1分でも 15分を知ることはできます。

タイマーのイベントが 入るたびに 変数に+1していき、15になったら処理をして 変数を 0に戻せばいいだけです。

投稿日時 - 2003-06-18 15:12:44

補足

早速の回答、ありがとうございます。
プログラム常駐は12時間行う予定なのですが、上記方法をとった場合、負荷は大丈夫でしょうか?

投稿日時 - 2003-06-18 15:38:46

あなたにオススメの質問