Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

C++でタイマーを使いたい

0 views
Skip to first unread message

Yanagida

unread,
Jun 15, 1999, 3:00:00 AM6/15/99
to
C++でタイマーを使いたいです。
そのような関数、あるいはコントロールはありますか?
ひじょうにこまっていますので、よろしくお願いします。

--
柳田由太
yu...@sala.or.jp
ホームページ(個人):
http://www.sala.or.jp/~yuta/index2.html

会社:
http://www2.ara-net.co.jp/stud/

Yanagida

unread,
Jun 15, 1999, 3:00:00 AM6/15/99
to
タイマーを使用するにはSetTimer関数などを使うことが分かりました。
しかし、使用の仕方が分かりません。
MFCを使わないで使用する方法を教えてください。

--
柳田由太
yu...@sala.or.jp
ホームページ(個人):
http://www.sala.or.jp/~yuta/index2.html

会社:
http://www2.ara-net.co.jp/stud/

Yanagida wrote in message <#dR2BEtt#GA.263@cppssbbsa03>...

広畑由紀夫

unread,
Jun 15, 1999, 3:00:00 AM6/15/99
to

 MFCを使用しないタイマーのつかいかたの一例。
MFCを使用せずにタイマーを使う場合、タイマーを使用する
Windowのメッセージ処理コールバック内で処理するのが簡
単です。
 以下の例では、メッセージ処理部分の初期化でタイマーを
設定(代入されている数値の意味はVCのオンラインマニュ
アルを参照してください)し、WM_TIMERメッセージでタイマー
の処理を行い、このWindowが破棄される前にタイマーを開放
する部分を記載しておきました。

 私は、Win2.xxのころこうした形でプログラムを作っていま
したが、いまでも通用するようです。
 タイマーの割り込みに関しては、できるだけ少ないほうがよい
ようで(Win16の頃はかなりタイマーリソースが限定されていた)、
複数のタイマーをIDで区別するよりも、タイマー内部でSemdMessage
関数などで、他のWindowにメッセージを発生させるなどで複数の
タイマーが必要な時に処理を割り当てたほうが無難です。
 MFCではほとんど意識して使うことはないですが、WM_TIMER
はWindowsシステムからのコールバックなので、共有データメモリー
の扱いについては気をつけてたほうが良いと思います。

// 簡単な例:完全ではないが...

UINT nIDEvent;
UINT nElapse;

MainCallBack(){

switch(mes){
case WM_CREATE:
nIDEvemt = 1;
nElapse = 100;
SetTimer(hWnd,nIDEvent,uElapse,NULL);
break;
case WM_TIMER:
break;
case WM_DESTROY:
// 少なくともこのメッセージループが終了する直前にはタイマーを解
放しておく。
KillTimer(hWnd,nIDEvent);
break;
}

}

-=-=-=-=-=-=-=-=-=-=-=-
(株)ソーゴー東京 コンピュータ担当 広畑由紀夫
http://www.sogopr.co.jp/ hiro...@sogopr.co.jp
RINGSERVER PROJECT Openlab 喜多狼Lab代表
http://openlab.ring.gr.jp/kitaro/ kit...@osk.3web.ne.jp
-=-=-=-=-=-=-=-=-=-=-=-

Yanagida

unread,
Jun 15, 1999, 3:00:00 AM6/15/99
to
似たような処理をやってみました。
タイマーが起こり、メッセージループに入り込んでいるようです。WM_TIMERにメッ
セージボックスを表示するようにしましたが、1秒ごとに表示されます。
そこで、本来の目的、hWndで指定された独自のダイアログボックスのテキストボッ
クスにSetDlgItemIntで文字を挿入しようとしても、ダイアログボックスが閉じられ
てしまいます。
SetTimer関数で指定したhWndと重複することに問題があるのでしょうか?
教えてください。

会社:
http://www2.ara-net.co.jp/stud/

広畑由紀夫 wrote in message <#BFaSZtt#GA.233@cppssbbsa03>...

Yanagida

unread,
Jun 15, 1999, 3:00:00 AM6/15/99
to
ご迷惑かけました
上の質問は私の初歩的な勘違いでした。
タイマー問題は解決しました。
柳田


広畑由紀夫

unread,
Jun 16, 1999, 3:00:00 AM6/16/99
to
 WM_TIMER イベントですが、以下のように再入を禁止しておく
(というより再入時は処理しない)ことでタイマーの再入による不足の
自体を防ぎます。
 WM_TIMERはこのメッセージ処理中もイベントが発生することが
あり、開発環境でちょうど1秒で処理がおわるばあいもユーザーに
よっては1秒でおわらず、イベント中にこのイベントが発生してしまう
ことが有ります。
 そのため、再入を禁止しておくことで、そうした自体に対処しておく
ことをお勧めします。
 とくにGDIをいじってアニメーションをおこなうとかの場合は必須で
、再入時にGDIリソースの再割り当てなどがおこると雪だるま式に
リソースを食いつぶし、ハングアップすることがあります。

 こうしたマルチスレッドライクな処理にはその再入にも気をつけて
おきましょう。

 もちろん、再入されてよい場合は別です。

case WM_TIMER:{
static BOOL bReEntry=TRUE;
if(bReEntry==TRUE){
bReEntry=FALSE; // 再入禁止



// ここに再入されては困る処理を書いておく



bReEntry=TRUE; // JOB終了

0 new messages