« PCが起動できなくなったらどうする? | トップページ | 風邪ひいたぁ~ »

2007年3月11日 (日)

「SetTimer」の不思議?

「SetTimer」で不思議な不具合に遭遇…。

「SetTimer」でタイマーをセットしているのにも関わらず
「WM_TIMER」が呼ばれない…。

正しくは、複数のタイマーがセットされているのに
1つのタイマーしか処理されない現象が発生。


で、追いかけること幾千里。

…いえいえ、幾晩も追いかけました。(T_T)

で、ようやく見つけた原因が…

処理落ち…。(笑)

処理落ちとは、予定時間内に処理が終わらない事です。
CPUが遅いと慢性的に処理時間がオーバーしたりします。

で、今回は、CPUが遅かったのが原因…。

どうせ俺のPCは、遅いよ…。

「WM_TIMER」内での処理時間が他のタイマー割り込み時間より
オーバーしていると他のタイマーが割り込めなくなる場合が
あると言う事。

それが、どこかが処理落ちした時にメッセージキューに
タイマーメッセージが溜まらないように「KillTimer」を使用する場合。

case WM_TIMER:
    KillTimer( hWnd, wParam );
    SetTimer( hWnd, wParam, TimerList[wParam], NULL );
    switch( wParam )
    {
    ~処理~
    }
    break;

この場合、1つのタイマー処理が慢性的に処置落ちすると
他の割り込みが入れなくなります。

ところが、2Kだとその処理を削除すると最低1回は、
タイマー割り込みが入ります。

case WM_TIMER:
    switch( wParam )
    {
    ~処理~
    }
    break;

98は、関係なく駄目でした…。

タイマーセット自体がメッセージキューに
エンキューされているのかも…?
タイマー処理の方が優先順位が高いのでタイマーセットの
メッセージが処理されないのだろうか?<謎です。

今回検証用プログラムが長いのでこちらからダウンして下さい。
検証用プログラム(VC++6用)
「TimerTest.lzh」


「SetTimer」の不思議を体感してみてください♪(笑)

PS.
理由を御存知の方は、御一報下され。

|

« PCが起動できなくなったらどうする? | トップページ | 風邪ひいたぁ~ »

コメント

そう言ってもらえると嬉しいですぅ♪
でも、できる人に比べたら私なんて足元にも及びませんょ~。

>日向ブログ リンクしてもいいですか(o・ω・o)?
わーい(^O^)/
ありがとうございます♪
是非こるんさんのHPも教えてくだされ♪

投稿: kouyou | 2007年3月12日 (月) 01時36分

私から見ればこういう記事を書けるKouyouさんもずば抜けて天才サンですo(^-^)o
機械に強い方はほんとに尊敬ですo(^-^)o
あっあといきなりですが
日向ブログ リンクしてもいいですか(o・ω・o)?

投稿: こるん | 2007年3月11日 (日) 16時26分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 「SetTimer」の不思議?:

« PCが起動できなくなったらどうする? | トップページ | 風邪ひいたぁ~ »