1

加速度計関連の質問です。(このサイトを初めて使用するため、フォーマットが正しく表示されない場合があります)。標準コードを使用して、加速度計が期待どおりに動作するようになりました

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = self;
accel.updateInterval = 0.1;   //I also tried other update values

クラスの accelerometer:didAccelerate: メソッドが呼び出されるたびに、NSLog を使用してログを記録します。関数は期待どおりに呼び出され、ここまではすべて正常に機能します。

ただし、ループを実行すると、上記のメソッドが呼び出されないようです。このようなもの

float firstAccelValue = globalAccel; //this is the x-accel value (stored in a global by the above method)
float nextAccelValue = firstAccelValue;

while (nextAccelValue == firstAccelValue){

    //do something
    nextAccelValue = globalAccel; // note globalAccel is updated by the accelerometer method

}

上記のループは、accelerometer:didAccelerate: メソッドが呼び出されないため、予想どおり終了しません。そのため、globalAccel が値を変更することはありません。

固定条件を使用して while ループを中断すると、ループが終了した後、メソッド呼び出しが再び正常に機能することがわかります。

ここで明らかな何かが欠けていますか?それとも、特定の処理が行われているときに加速度計メソッドが起動しないのでしょうか?

どんな助けでも大歓迎です!ありがとう!

4

2 に答える 2

2

float(と比較しないでください==。)

CPU はループによって占有されており、更新されたアクセラレータ値を提供する時間がありません。

-accelerometer:didAccelerate:は加速度が変化するたびに呼び出されるので、単に を使用しないのはなぜifですか?

// in -accelerometer:didAccelerate:
if (fabs(nextAccelValue - firstAccelValue) < 0.0001) {
   // do something
   nextAccelValue = globalAccel;
}
于 2010-04-22T06:00:27.850 に答える
0

どうもありがとう!(float の比較については、はい、わかりました。これは単なる例です)。

実際、私がやりたいことは次のとおりです。ボタンが押された後、加速度計の値 (firstValue) を取得し、それが変化するまで (firstValue に相対的な特定の値を言う) 待ってから、いくつかのタスクを実行します。そのため、whileループを使用していました。(私が示したループは、変更されるまで待機するだけですが、機能したら必要な正確な変更条件を設定できます)。

あなたの答えから、私は -accelerometer:didAccelerate: 関数自体でタスクを実行できることを理解しています (必要なすべてのデータにアクセスできるため、ボタンが押されたかどうかを示す変数にアクセスできるようにすることができます)。どうもありがとうございました。この方法でうまくいくと思います。

しかし、ちょっと興味があります - それ以外の方法はありますか? 処理が多すぎて CPU を占有している場合、強制的に加速度計を更新することはできますか? CPU 自体を占有するループは、値が変化するまで待機する方法にすぎないため、優先度は低くなります。

再度、感謝します!

于 2010-04-22T19:55:02.453 に答える