1

キーを入力するためのタイマーとライトをオフにするためのタイマーを1つ設定したいのですが、最初に設定したタイマーを使用し、複数のタイマーを設定できず、2番目のタイマーが機能しませんでした。

私は以下のコードを使用します

int timer1, timer2;
long events;
timer1 = set_timer(8000, EVT_TIMER);
timer2 = set_timer(5000, EVT_TIMER);
while(1){
events = wait_event();
if(events & EVT_KBD){
clr_timer(timer1);
break;
}
else if (events & EVT_TIMER)
{
printf("TIME_OUT");
break;
}

while(1){
events = wait_event();
if(events & EVT_KBD){
clr_timer(timer2);
break;
}
else if (events & EVT_TIMER)
{
printf("TIME_OUT2");
break;
}
}
4

2 に答える 2

1

もう 1 つの方法は、タイマーを独自のデータ構造 (タイマーの有効期限順に並べ替えられたリストなど) に保持し、最初に期限切れになるタイマー (つまり、並べ替えられたリストの最初のタイマー) に対して 1 つのシステム タイマーのみを使用することです。

システム イベントを受け取るとEVT_TIMER、有効期限が過ぎているすべてのタイマーを起動します (並べ替えられたリストからそれらを削除します)。

リストにタイマーが残っている場合は、新しい最初のタイマーの期限が切れる新しいシステム タイマーを開始します。

(少なくとも) 2 つの注意事項があります。

  • 新しいタイマーを追加するときは、それが期限切れになる最初のタイマーになっていないかどうかを確認する必要があります。その場合は、既存のシステム タイマーをキャンセルしclr_timer()、新しい最初のタイマーが期限切れになるように新しいシステム タイマーを設定する必要があります (新しく追加されたタイマーは、ソートされたリストの最初になります)。空のリストに新しいタイマーを追加するときに呼び出しをスキップしclr_timer()ます (現在アクティブなシステム タイマーがないため)

  • 呼び出しを使用しread_ticks()てタイマーの有効期限を計算する場合 (またはその他の目的で)、値がオーバーフローしてゼロに戻った場合 (これは 49.7 日ごとに発生します) を処理するようにしてください。

于 2016-08-25T23:20:58.843 に答える