VS2005 VCあるいはVBのプログラミングについて教えてください。指定した時間以降はプログラム内のコード、あるいは関数を実行、その後、指定した時間にこのコードあるいは関数を停止したいのですが、どのようにコーディングすればよろしいでしょうか?関数と書きましたがスレッドでもかまいません。

定期的に時間を取得して(タイマーをキーとして)比較し、開始、終了を行うことは可能ですが、通常の時間指定バッチ制御プログラムはもう少し違ったことをやっているのかなとおもって聞いています。

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2009/11/04 12:22:42
  • 終了:2009/11/11 12:25:02

回答(2件)

id:hakkyoku No.1

hakkyoku回答回数32ベストアンサー獲得回数22009/11/05 23:21:03

ポイント35pt

期待されている答えじゃないかもしれませんが

Windows タスクを利用すれば良いのではないでしょうか

http://www.atmarkit.co.jp/fwin2k/win2ktips/335tasksched/tasksche...


1.フォームロードイベントに実行したい処理を記述して

処理が終了したらアプリケーションを終了させる様に記述する

2.1のexeファイルを作成する

3.1~2の手順で目的の処理別にexeファイルを複数作成する

4.作成したexeファイルをタスクで指定した時間に起動させる

id:mai_mai_mail

丁寧なご回答ありがとうございます。きちっと書けばよかったのですが、今回の質問のキーは終了時間も指定できるかでした。たとえば、ループ(WAIT)しているEXEの場合は明示的に終了時刻を設定しないと終わらないので。

2009/11/06 01:03:59
id:ardarim No.2

ardarim回答回数896ベストアンサー獲得回数1442009/11/07 23:21:09

ポイント35pt

Windowsにはスケジュール管理するAPIはありませんので、自分でプログラムで実現することになります。例えばこんな感じになるかと思います。

1)現在時刻を取得

2)起動時刻と現在時刻の差分(待ち時間)を取得

3)待ち時間分待つ

4)対象のスレッドを起動する

5)現在時刻を取得

6)終了時刻と現在時刻の差分(待ち時間)を取得

7)待ち時間分待つ

8)対象のスレッドを終了する

関数を実行したい場合は、関数を実行するだけのスレッドを起動することになります。


スレッドの終了は、基本的にはイベントなどのスレッド間通信の仕組みで実現することになります。

呼び出される側(スレッドまたは関数)と通信する仕組みがない場合はTerminateThreadなどのAPIで強制的に終了するしかありませんが、この場合呼び出される側で終了処理ができませんので、ステートレスな処理しかしないのであれば問題ありませんが、ファイルやデータベースを操作する処理の場合は強制終了で問題が起きる可能性があります。

  • id:standard_one
    単にWM_TIMERで叩き起こされては短い処理をしてまた眠るという処理がしたいわけではなく、動きっぱなし(無限ループ中とか)の関数を時間が来たら強制的に中断したいってことですか?
  • id:mai_mai_mail
    コメントありがとうございます。はい、強制終了でも問題ありません。お聞きしたかったのはardarim さんが回答されたような処理は想像がつきましたが、それなりにオーバーヘッドがかかるのでwindowsの機能、あるいは自分でプログラムを書いてもオーバーヘッドが少なく済む、終了時間になったことを知る手段をしりたいと思い質問しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません