C言語関係掲示板

過去ログ

No.1040 タイマー割り込みの使い方

[戻る] [ホームページ]
No.13376

タイマー割り込みの使い方
投稿者---Sakura(2004/03/26 17:52:22)


VisualC++ でWindowsのダイアログベースのプログラムを作っています。

そこでタイマー割り込み処理(set_timerとOnTimer)をさせているのですが
別の関数内でfor文やWhile文を使うとその間だけタイマー割り込み処理部分が
実行されません。

根本的に使い方としてよくないのでしょうか?
それとも何か回避策はあるのでしょうか?
よろしくお願いいたします。


No.13387

Re:タイマー割り込みの使い方
投稿者---RAPT(2004/03/26 21:02:31)


スレッドを使えばできます。
# for文は、CPUを占有し、タイマー割り込みを発生させません。


No.13391

Re:タイマー割り込みの使い方
投稿者---samsara(2004/03/26 23:34:43)


VisualC++はあまり使用しませんが・・・。

例えばこんな感じ(いい加減ですみません)の場合。
Func()
{
for(){
/*ループ処理*/
}
}
OnTimer()
{
/*タイムアウト処理*/
}
同一のスレッドでこれらの関数が呼ばれる場合には、Func内を
実行している時にタイムアウトが発生しても、Funcを抜けて
からでないと、OnTimerが実行されることはないのです。
したがって、あまりにもループ処理にかかる時間が長い場合には、
タイムアウトが発生してからOnTimer関数が呼ばれるまでに時間が
かかってしまう場合があります。

タイマを100msに設定した時に、ループ処理が1秒かかっていた
のでは場合によっては1秒間はOnTimerが呼ばれないことがあり
そうですね。逆にタイマを1秒に設定しループ処理が100msだった
場合には、最悪1.1秒で済みそうですね。単純計算でですが。

ループ処理を別のスレッドで実行させる事で、タイムアウト発生後
すぐにOnTimer関数を呼ぶようにすることができます。

この際、"スレッド"と言う技を身につけちゃいましょう。


No.13397

Re:タイマー割り込みの使い方
投稿者---たいちう(2004/03/27 02:17:38)


> 根本的に使い方としてよくないのでしょうか?
> それとも何か回避策はあるのでしょうか?

RAPTさんsamsaraさんが書いているようにスレッドを使えばできます。
できますが、スレッドを使わなくても解決するかもしれません。
プログラミングを続けるならいずれ覚える必要があるでしょうが、
今のあなたの問題の解法としてスレッドがベストとは限りません。

ループとタイマー割り込みでそれぞれどのような処理をしたいのですか?

No.13398

Re:タイマー割り込みの使い方
投稿者---Sakura(2004/03/27 03:32:25)


ありがとうございます。
スレッドですか?
初心者なものでどのようなものか解りませんが調べてみます。
どこかのサイトにお勧めなものは無いでしょうか?

>ループとタイマー割り込みでそれぞれどのような処理をしたいのですか?
作ったのは
1)まずモーターを動かして
2)指定位置のセンサがONするまで待つ。
 これをfor分で作って。
3)その間、割り込みで現在位置情報を得るというものです。

現在位置情報はモーターが動いている間だけではなく
ずっと監視するような動作にしたかったため
割り込み動作にしました。


No.13407

Re:タイマー割り込みの使い方
投稿者---samsara(2004/03/27 23:33:25)


>1)まずモーターを動かして
>2)指定位置のセンサがONするまで待つ。
> これをfor分で作って。
>3)その間、割り込みで現在位置情報を得るというものです。

タイマがタイムアウトするとOnTmer関数が呼ばれるように、
センサがONになるとOnSenser関数が呼ばれるようにすることは
できないものでしょうか?これであれば、センサがONになるまで
ループで待つことがないと思うので、
タイムアウト後すぐにOnTimerが呼ばれると思います。
掲示板では良く解らないので無理なことを
言っているかもしれませんが・・・。
もしかしたら、センサがONになってOnSenser関数を呼ぶところを
スレッドを使用して作るのかな?

No.13429

Re:ありがとうございました。
投稿者---Saklura(2004/03/29 18:11:21)


みなさまの意見を参考に
・スレッドを使う。
・処理を呼ぶタイミングを変える。
ということをやってだいたい理想に近づきました。

実際にはモータの動く軌跡も取りたかったもので
このような処理が必要になりました。
ありがとうございました。