![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
現在、一定期間のタスク処理について悩んでいます。
あるプログラムをタスクトレイに常駐させています。
このプログラムは、DBにアクセスするプログラムで、15分間隔でDBにアクセスしようとしています。
当初は、
1.タイマーイベントで処理する。
2.Windowsのタスクを使用する。
と考えていたのですが、
1.タイマーのインターバル(最大)は、約65000で
15分は設定できない。
2.タスクは、プログラムが常駐している為、初回
実行のみ行われる。(つまりずっとタスク実行中
となる。)
という問題にぶつかってしまいました。
何か良い方法はないでしょうか?
http://oshiete1.goo.ne.jp/kotaeru.php3?q=571156
なども参考にはしてみたのですが・・・
どうかよろしくお願い致します。
No.4ベストアンサー
- 回答日時:
あくまで個人的意見
カウント形式は好きくない。
タイマーイベントが発生したら、
前回実行から15分以上経過しているかどうかで
判断する方が好き。
割り込み系プログラムの基本ダワサ
No.13
- 回答日時:
あのね、専門家の方に刃向かうつもりは全くないのですが、6001なんていう8bit出されたら困っちゃいますね。
そんなころは、私でも時刻取得していましたよ。time$をシリアル値に変換するとか、越年とか閏年とかいろいろありましたよね。
私が言ってるのは、BASICの話ではなく、MS-DOSの疑似マルチタスクの話です。
CでもCOBOLでもなく、アセンブラ。
640KBのメモリ空間の最上位パラグラフに常駐させるプログラムです。標準実装128KBなんて言う時代ですから、常駐サイズを極力減らして、割り込み時のクロック数もできるだけ減らして、というときの話です。
まあ、人のところで論争するつもりもないんですがね。
おっしゃるとおり素人と玄人の違いでしょうな。
No.12
- 回答日時:
>98
98どうこうの話じゃ無いと思うのだが、、、
6001をやってた頃(ゲーム中心)、時計を作るプログラムと、タイマを作るプログラムは違っていた。
この時もやはり、タイマは経過時間を取得していた。
時計を作るプログラムは、ハードの時間を読み取るのは反則なので、カウンタを使用していた。
しかしそれはあくまで練習問題用であって、実務的ではない。
N88ベーシックを使用するOSは、そもそもマルチタスク?
んなわきゃ無い。
割り込みを発生させるのは、ハードからじゃないと出来ないはず。
よってCOBOLの話になる。
>昔からそうらしいです。
というのは、そもそもこの時代の事からのこと。
電気メータもUPSも、主にCとCOBOLで開発されている。
練習問題の本と、実務アルゴリズムの本では、違う。
No.11
- 回答日時:
#2,#3,#6です。
まだ、閉店してなかったんですね。ここ。
過去の書き込みを覗いていたら、ここに行き当たったんです。で、カウンタ派の言い訳を考えてたことを思い出したので、ついつい書き込んでしまいました。
カウンタを使って長時間のタイマを設定するやり方はプログラム入門の本に書いてあるから素人プログラマが多用することになっているのですが、カウンタ使用が多用されるようになったのは、NEC:PC9801系のマシン語プログラムからだと思うのです。
NEC:PC9801には、ハード割り込みにタイマ割り込みがありますが、常駐プログラムに使うには色々と支障があったので、VSYNC割り込み(画面表示用の1/60秒ごとに発生する割り込み)を使用することが多かったのです。
当時のパソコンは今と比べるとカメのように遅かったので、時刻取得BIOS呼び出しも、結構時間がかかるので、できるだけ使わないようにコーディングしなければなりませんでした。
タイマが1/60の固定ですから、それを「数える」しか方法がないということで登場したのが、カウンタ方式です。
汎用機故の工夫だったのです。
今となってはもはやそんなことまで考える必要はなく、専門機と同じように時刻比較の方が正確に時間が計れるのでしょうが、なかなか昔の癖は抜けないのですな。
閉店してたつもりだったのですが、まだ生きてましたね。申し訳ございませんでした。
PC9801、なつかしいですね。
あの頃はプログラムなんて全くわからなく、ベーマガのサンプルをよく打ち込んでいました。
ま、SyntaxErrorばかりでしたが(笑)
今回はどうもありがとうございました。
No.10
- 回答日時:
2番はプログラムを終了させるわけにはいかないのかな?
どうでもいいけど・・。解決策はもうでていることでしょうから
自分の思うように動くようにがんばってください。
一応前の投稿に名前があったから記念カキコ
No.9
- 回答日時:
書き込みワショーイ
電気ブレーカー じゃなく 企業向け電気メーターだった。
家庭用なら、家の横についてる(時々おばちゃんが見にくる)やつ。
でも一般家庭用は、時間の概念がないから、割り込みタイマはついてないはず。
No.8
- 回答日時:
>プログラム常駐は12時間行う予定なのですが、上記
>方法をとった場合、負荷は大丈夫でしょうか?
私が記載した手段を用いた場合、メモリリークなど発生しません。
どちらかというと、その15分の時の処理をどのように
記述するのかが問題です。
No.7
- 回答日時:
多くの電気ブレーカーは割り込み機能を持っています。
大手のメーカの商品は、全てカウンタではやってません。
昔からそうらしいです。
UPSも割り込み機能を持っています。
大手のメーカの商品は、全てカウンタではやってません。
昔からそうらしいです。
>現在時刻と前回実行時刻を比較するのはとても素晴らしい方法ですね。
私が考えたわけではありませんので、あまり喜べないのですが、、、ただ、、、
大手のメーカの割り込みを発生させる商品は、全てカウンタではやってません。
昔からそうらしいです。
No.6
- 回答日時:
三度#2です。
えと、時刻シリアル値の比較という答えがありましたが、非常に優れた方法だというのは認めます。が、負荷という意味では、ただの整数値のインクリメントとシリアル値(倍精度実数)の比較では大分差があります。まあ、クロックレベルの話なので、どうでもいいって言えばいいんですが。カウント派の意見です。
で、精度の問題が述べられていますが、マルチタスクである以上、完璧に設定通り実行させるのは不可能です。ものすごおくリソースを使うプログラムが動いていれば、間隔が開いてしまったりするからです。
この意味で、現在時刻と前回実行時刻を比較するのはとても素晴らしい方法ですね。
タイマー割り込みの間隔を短くすればするほど精度が上がります。
なので、時刻比較を使うのであれば、負荷とのバランスで割り込み間隔を使うといいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スーパーのレジで並んでいたら...
-
割り込み処理について
-
特殊なパターンの人見知りに悩...
-
PICのI2C通信を行っているとき...
-
Macターミナルで実行中のプログ...
-
バックグラウンドのプロセスの...
-
緯度、経度の 10進法と 60進法...
-
VBSの処理中一旦処理を止めて再...
-
コンソールアプリケーションの...
-
ソケットとそれに基づくストリ...
-
VBAの配列サイズとメモリに関して
-
【MFC】イベントの無効化について
-
TCP/IP通信時のサーバーからの受信
-
ADOでアクセスのレコードに...
-
explorer.exeが異様にメモリを食う
-
プロダクションコードとは?
-
C# シリアル通信でデータ受信...
-
【C言語】再帰が時間がかかる...
-
SQLの速度をあげるには・・・
-
ファイルマッピング関数で失敗
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
電車で待機列の割り込みについ...
-
スーパーのレジで並んでいたら...
-
USJでの割り込み
-
pic 複数の割り込み関数 切り分...
-
一定時間操作がなかったら、と...
-
Amazonfireタブレットにわから...
-
【組込み】割り込み中のstatic...
-
VB6でSendKeyを利用したTab移動...
-
CPU負荷率の安全な上限と計...
-
マイコンSH-2の割り込みを用い...
-
Excelでタイマーの一時停止する...
-
割り込み中に例外異常
-
CPUの処理量を減らすコーデ...
-
このレジの並び方は間違ってま...
-
PICのPIN変化割り込みに...
-
STATUSのZフラグについて
-
駅のトイレでナイチンに邪魔さ...
-
電車乗車時、並んでいるのに割...
-
PICマイコンでエンコーダパルス...
-
割り込み処理のシミュレート
おすすめ情報