重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

プログラム初心者です。質問させてください!

現在私はWin32APIを用いて、簡単なプログラムを作成しています。
そこで例えばイベントAが起きた10秒後にあるアクション(1)をさせたくて、

WM_イベントAの時: SetTimer(hWnd,ID_MYTIMER1, 10000, NULL);

というようにプログラムを書きました。
そのSetTimer関数が実行されることより、
WM_TIMER:イベントが発生するので、WM_TIMER:イベントのところにあるアクション(1)をさせるプログラムを書きました。

しかし、イベントAが起きた100秒後には、あるアクション(1)とは違うあるアクション(2)をさせたいのですが、
この場合、WM_イベントAが起きたときに、
SetTimer(hWnd,ID_MYTIMER1, 10000, NULL);
SetTimer(hWnd,ID_MYTIMER2, 100000, NULL);
のようにプログラムをかいてしまうと、
二つともWM_TIMERイベントがおこるので、
あるアクション(1)も(2)も100秒後には実行されてしまいます。
100秒後にはアクション(1)はおこらず、アクション(2)だけおこる。
10秒後にはアクション(2)はおこらず、アクション(1)だけおこる。
このようにするには、どのようにすればいいのでしょうか?
アドバイスよろしくお願いいたします。

A 回答 (3件)

wParam にタイマの識別子が入っていますので、それを利用して分岐処理してください。



LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg){
case WM_TIMER:
switch(wParam){
case ID_MYTIMER1:
KillTimer(hWnd, ID_MYTIMER1);
// アクション(1)
break;
case ID_MYTIMER2:
KillTimer(hWnd, ID_MYTIMER2);
// アクション(2)
break;
}
break;
}
}
    • good
    • 0
この回答へのお礼

返事が遅くなり大変申し訳ございません!
そしてご丁寧な回答ありがとうございました!!
おかげさまで謎が解けました!!

お礼日時:2007/01/10 18:16

★別回答


・タイマー間隔は 10 秒にして、static なカウンタを用意します。
・WM_TIMER でカウンタが 10 回になったときだけ、アクション(2)を
 それ以外は、アクション(1)を処理する。ってどう。

★サンプル
static LRESULT CALLBACK UserWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
 static int nCount; ←先頭に記述。
 
 switch ( uMsg ){
  case WM_イベントAの時:
   nCount = 0;
   SetTimer( hWnd, ID_MYTIMER1, 10000, NULL );
   break;
  case WM_TIMER:
   if ( ++nCount >= 10 ){
    nCount = 0; ←リセット
    アクション(2);
   }
   else{
    アクション(1);
   }
   break;
  Default:return( DefWindowProc(hWnd,uMsg,wParam,lParam) );
 }
 return( 0 );
}

最後に:
・上記の方法ならば、2回発生するタイマー処理の同期が取れますよ。
・タイマの識別子を比較して分岐する方法は同期を取るときに少し工夫がいります。
・また、WM_TIMER の部分をコールバック関数にして SetTimer の第4引数に渡すと
 WM_TIMER ルーチンよりは、ほんの少しだけタイマー精度が上がります。

参考URL:http://wisdom.sakura.ne.jp/system/winapi/win32/w …
    • good
    • 0
この回答へのお礼

返事が遅くなり、大変申し訳ございません!
とても詳しいご回答、本当に感謝しております。
プログラミングって慣れるまでが大変ですが、いろいろなことができておもしろいですね!
頑張って私も早く熟練者になりたいです。ありがとうございました!

お礼日時:2007/01/10 18:20

ウィンドウメッセージを処理するときに、


引き数の代わりとなるものは、基本的にwParamやlParamです。
この場合も同様のことが言えます。
WM_TIMERイベントが起こったときには、wParamにタイマーIDが格納されています。

このwParamをうまく使って(といってもただ比較するだけですが)がんばりましょう。

一応、WM_TIMERイベントの簡単な説明を見つけましたので、URLも参照するといいと思います。

参考URL:http://www.winapi-database.com/Message/WM/WM_TIM …
    • good
    • 0
この回答へのお礼

返事が遅くなり大変申し訳ございませんでした。
wParam、しっかり覚えておきます!
ありがとうございました!!

お礼日時:2007/01/10 18:17

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