「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.
理由を御存知の方は、御一報下され。
| 固定リンク
コメント
そう言ってもらえると嬉しいですぅ♪
でも、できる人に比べたら私なんて足元にも及びませんょ~。
>日向ブログ リンクしてもいいですか(o・ω・o)?
わーい(^O^)/
ありがとうございます♪
是非こるんさんのHPも教えてくだされ♪
投稿: kouyou | 2007年3月12日 (月) 01時36分
私から見ればこういう記事を書けるKouyouさんもずば抜けて天才サンですo(^-^)o
機械に強い方はほんとに尊敬ですo(^-^)o
あっあといきなりですが
日向ブログ リンクしてもいいですか(o・ω・o)?
投稿: こるん | 2007年3月11日 (日) 16時26分