• ベストアンサー

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

現在、一定期間のタスク処理について悩んでいます。 あるプログラムをタスクトレイに常駐させています。 このプログラムは、DBにアクセスするプログラムで、15分間隔でDBにアクセスしようとしています。 当初は、  1.タイマーイベントで処理する。  2.Windowsのタスクを使用する。 と考えていたのですが、  1.タイマーのインターバル(最大)は、約65000で    15分は設定できない。  2.タスクは、プログラムが常駐している為、初回    実行のみ行われる。(つまりずっとタスク実行中    となる。) という問題にぶつかってしまいました。 何か良い方法はないでしょうか? http://oshiete1.goo.ne.jp/kotaeru.php3?q=571156 なども参考にはしてみたのですが・・・ どうかよろしくお願い致します。

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

  • ベストアンサー
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.4

あくまで個人的意見 カウント形式は好きくない。 タイマーイベントが発生したら、 前回実行から15分以上経過しているかどうかで 判断する方が好き。 割り込み系プログラムの基本ダワサ

その他の回答 (13)

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.14

>CとCOBOL 間違い Cとアセンブラだった >人のところで論争するつもりもないんですがね。 なら、なぜカウンタにこだわる?不思議だ。

  • yomo3
  • ベストアンサー率32% (88/269)
回答No.13

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

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.12

>98 98どうこうの話じゃ無いと思うのだが、、、 6001をやってた頃(ゲーム中心)、時計を作るプログラムと、タイマを作るプログラムは違っていた。 この時もやはり、タイマは経過時間を取得していた。 時計を作るプログラムは、ハードの時間を読み取るのは反則なので、カウンタを使用していた。 しかしそれはあくまで練習問題用であって、実務的ではない。 N88ベーシックを使用するOSは、そもそもマルチタスク? んなわきゃ無い。 割り込みを発生させるのは、ハードからじゃないと出来ないはず。 よってCOBOLの話になる。 >昔からそうらしいです。 というのは、そもそもこの時代の事からのこと。 電気メータもUPSも、主にCとCOBOLで開発されている。 練習問題の本と、実務アルゴリズムの本では、違う。

akikan0125
質問者

お礼

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

  • yomo3
  • ベストアンサー率32% (88/269)
回答No.11

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

akikan0125
質問者

お礼

閉店してたつもりだったのですが、まだ生きてましたね。申し訳ございませんでした。 PC9801、なつかしいですね。 あの頃はプログラムなんて全くわからなく、ベーマガのサンプルをよく打ち込んでいました。 ま、SyntaxErrorばかりでしたが(笑) 今回はどうもありがとうございました。

  • Seiryo
  • ベストアンサー率13% (27/203)
回答No.10

2番はプログラムを終了させるわけにはいかないのかな? どうでもいいけど・・。解決策はもうでていることでしょうから 自分の思うように動くようにがんばってください。 一応前の投稿に名前があったから記念カキコ

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.9

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

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.8

>プログラム常駐は12時間行う予定なのですが、上記 >方法をとった場合、負荷は大丈夫でしょうか? 私が記載した手段を用いた場合、メモリリークなど発生しません。 どちらかというと、その15分の時の処理をどのように 記述するのかが問題です。

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.7

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

  • yomo3
  • ベストアンサー率32% (88/269)
回答No.6

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

noname#4564
noname#4564
回答No.5

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

関連するQ&A

  • phpのプログラムで一定間隔で処理をする方法

    phpのプログラムで一定間隔で処理をする方法 phpのプログラムで5秒に1回しか処理しない方法はありますか? 同時に2人がアクセスしても、2人目のアクセスは5秒待ち状態になるようにしたいです。 ユーザー側からのアクセスで実行されるのが前提なので、 制限の掛ける方法で悩んでいます。 どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • タスクトレイにあるプログラムを起動するショートカットキーは?

    Windows 2000 serverを使用しています。 現在、なぜかマウスが動きません。 タスクトレイに常駐しているプログラムにアクセスしたいのですが、マウスが動かないので出来ません。 タスクトレイにキーボードだけでアクセスすることは出来ますか?

  • 一定間隔でプログラムを実行するには?

    WindowsNTでプログラムを10分間隔で実行したいのですが、ATコマンドやタスクスケジューラでは分間隔の設定ができすに困っています。 良い方法がありましたらご教授よろしくお願いします。

  • タスクトレイの常駐解除後について

    VB6(SP6)にてタスクトレイに常駐するプログラムを作成しました。 そして、プログラムを終了するとき下記コードにて常駐を解除しています。 Private Sub Form_Unload(Cancel As Integer) 'タスクトレイのアイコンを消去 ingAPIReVal = Shell_NotifyIcon(NIM_DELETE, nidNoftyIconData) '終了 End End Sub プログラムは無事終了するのですが、タスクトレイにアイコンが残ってしまいます。 マウスをタスクトレイに近づけると消えるのですが... 極端な話 5回実行・終了を繰り返すと、同じアイコンが5個並び...マウスを近づけると一気に消えてしまいます。 プログラムの動作に問題はないのですが、あまり体裁が良いとは思えず どうにかならないかと質問させて頂きました。 対処方法をご存じの方、ご教授下さいm(__)m

  • タスクトレイの常駐ソフト管理

    タスクトレイの常駐ソフト(プログラム)を管理、削除するフリーソフトってありますか? PCを使ってるうちに、かなりの数の常駐ソフトがタスクトレイに入ってしまいました。 動作がかなり重いです。 よろしくお願いします。

  • windows bat タスクの実行

    実行環境:windows 2003 server タスクの実行でbatをスケジュール実行したい。 ただし、ネットワーク障害などを考えて、バッチがぶつかることを避けるため、 バッチが実行中の場合は次の間隔で実行されるバッチを停止させたいのですが、 タスク実行設定画面で設定することは可能でしょうか? または、バッチ処理内で処理することは可能でしょうか 条件:一日、4分間隔で実行

  • Windowsプログラミングでのタスクトレイへの格納について

    Windowsプログラミングでのタスクトレイへの格納について 以下の動作を実現したいです。 (1)初回プログラム起動時タスクトレイにアイコン表示 (2)タスクトレイアイコンのポップアップメニューからプログラムのリージョンウィンドウを表示できる (3)以後デスクトップとタスクトレイ間で出し入れ可能 Shell_NotifyIcon関数などをつかってプログラム起動後メニューなどからメッセージをつかんで出し入れはできるのですが、初回起動時にタスクトレイに格納しようとするとリージョンウィンドウが表示されたままタスクトレイにアイコンが追加されてしまいます。起動時にタスクトレイのみに表示されるようにする方法分かる方教えてくださいお願いします。

  • JavaでWindowsのタスクトレイに常駐するプログラムを書きたいの

    JavaでWindowsのタスクトレイに常駐するプログラムを書きたいのですが、どうやれば出来るでしょうか?

    • ベストアンサー
    • Java
  • VISTAのタスクトレイにある常駐ソフトを消したい。

    VISTAにフリーソフトの「AVG Anti-Virus Free Edition 7.5.472」をDLしました。そうするとタスクトレイに常駐プログラムとして起動するようにならました。常駐するのは邪魔なのでスタートアップから外すと「スタートアップ プログラムの一部が Windows でブロックされています」とメッセージがでます。このソフトを常駐させずに使いたい時に使えるようにするにはどうすればいいですか? 単純にタスクレイトの常駐から外したいだけなんですがうまくいきません。

  • 特定のページを外部から一定間隔でリロードしたい

    たとえば http://oshiete1.goo.ne.jp/index.php というページを 外部から(phpに直接プログラムを書き込まずに)3分間隔でリロードすることは可能でしょうか?

    • ベストアンサー
    • CSS

専門家に質問してみよう