アプリ版:「スタンプのみでお礼する」機能のリリースについて

VC2005で、MFCアプリを作成しています。
ループを使わずに、ある指定時間もしくは、1時間後など設定した時間にイベントが発生し、その中で処理を入れる(例えば、時間が来ましたなどのメッセージ)を表示させるプログラムが書きたいです。

一回だけで終わるのではなく、イベント発生後、今度は2時間後にイベントを発生させるようなこともしたいです。

何かわかりやすいサンプルでもありましたら、助かります。

A 回答 (5件)

アプリ内で時間待ちループすることはGUIアプリが一番やってはいけない事です。


なので、SetTimerで一定周期でWM_TIMERメッセージを発生させるのが一般的です。WM_TIMERのイベントハンドラを追加すれば時間経過時の処理が書けます。
SetTimerでは一定周期でイベントが発生するので、回数を数えることで時間経過を知ることが出来ます。例えば、SetTimerで1秒おきにした場合は、3600回で1時間になりますよね。2時間後なら、その倍です。

この回答への補足

ありがとうございます。
WM_TIMERイベントで補足できました。

今回は、経過時間でイベントを発生させましたが、特定の時間にイベントを発生する(例えば、午後1時にBEEP音を鳴らす。午後5時30分に、このアプリケーションが自動的に終了する)ことは可能でしょうか。

何時・何分で動作させたいです。

補足日時:2009/04/14 16:21
    • good
    • 0

あぁ、ボケかましました。

nIDEventで区別できましたね。
UINT_PTRは、配列に出来ないので別変数でお願いします。
    • good
    • 0

UINT_PTRの配列化は考えられていないみたいですね。


どちらにしろ、同じウィンドウ内でタイマーイベントを2つ発生させるのは仕組み的に出来ないので、1つのタイマーイベントで2つの処理を同時に行ってください。

この回答への補足

>同じウィンドウ内でタイマーイベントを2つ発生させるのは仕組み的に出来ないので・・・

2つ動いていますが・・・
片方は3秒ごとカウントした数字が表示され、
もう一つは5秒毎にBeep音が鳴っています。




void CTimerTestDlg::OnTimer(UINT_PTR nIDEvent)
{
switch (nIDEvent){
case 1:

case 2:

...

補足日時:2009/04/14 19:12
    • good
    • 0

>何時・何分で動作させたいです。


そういったのは用意されていないので、SetTimerで1秒毎に監視イベントを起こしてWindows自身の時計を監視するのが良いと思います。

GetLocalTime()関数を使います。
http://www.dev.pei.jp/programming/sdk/sdk52.html
この取得値と予定していた時刻が一致したら、更に処理を呼び出せば良いことですから。

この回答への補足

ありがとうございます。
新しいタイマーを作成して、1秒毎にGetLocalTime()で時間を調べることに・・・といきなり解決できないエラーが出まして、

UINT_PTR m_nTimer;
の時は問題なかったのですが、

新しいタイマーを作成するために
UINT_PTR m_nTimer[2];
とすると、
error C2040: 'm_nTimer' : 'UINT_PTR [2]' は 'UINT_PTR' と間接操作のレベルが異なります。

WM_DESTORYイベントが発生した時に、KillTimerする時の引数なのですが、
UINT_PTRは配列に定義できないのでしょうか?

補足日時:2009/04/14 18:41
    • good
    • 0

CWnd::SetTimer


http://msdn.microsoft.com/ja-jp/library/49313fdf …
はどうでしょう

この回答への補足

ありがとうございます。
WM_TIMERイベントで補足できました。

時間をはかるようなものは、SetTimer以外はなくて、基本的にこれを使ってプログラムするということですか?

補足日時:2009/04/14 16:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!