2010-04-22 7 views
1

Une question liée à l'accéléromètre. (Désolé le formatage ne semble pas correct, c'est la première fois que j'utilise ce site). Je suis l'accéléromètre de travail comme prévu en utilisant le code standardAccéléromètre iPhone: didAccelerate: ne semble pas être appelé pendant que je cours une boucle

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

J'utilise NSLog pour se connecter à chaque fois que l'accéléromètre: didAccelerate: méthode dans ma classe est appelée. La fonction est appelée comme prévu et tout fonctionne bien jusqu'à ici. Cependant, lorsque j'exécute une boucle, la méthode ci-dessus ne semble pas appelée. Quelque chose comme ça

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 

} 

La boucle ci-dessus sort jamais, depuis l'accéléromètre expectedly: didAccelerate: méthode n'est pas appelé, et par conséquent ne change jamais globalAccel valeur.

Si j'utilise une condition fixe pour rompre la boucle while, je peux voir qu'après la fin de la boucle, les appels de méthode fonctionnent à nouveau correctement.

Est-ce que je manque quelque chose d'évident ici? Ou la méthode de l'accéléromètre ne se déclenche-t-elle pas lorsque certains traitements sont en cours?

Toute aide serait grandement appréciée! Merci!

Répondre

2

(Ne pas comparer float avec ==.)

La CPU est occupée par la boucle et n'a pas le temps de vous donner la valeur de l'accélérateur mis à jour. Comme -accelerometer:didAccelerate: est appelé chaque fois que l'accélération change, pourquoi ne pas simplement utiliser if?

// in -accelerometer:didAccelerate: 
if (fabs(nextAccelValue - firstAccelValue) < 0.0001) { 
    // do something 
    nextAccelValue = globalAccel; 
} 
+0

KennyTm Je viens de regarder votre réponse au sujet de accelerometer.I suis face à un problème avec accelerometer.Could vous s'il vous plaît jeter un oeil à [mon post] (http://stackoverflow.com/questions/12246029/how-to-achieve- vigoureux tremblement en ios) .. Je suis vraiment du mal à résoudre ce problème pour plus d'un month.Thanks – GoCrazy

0

Merci beaucoup pour ça! (A propos de la comparaison de flotteurs, oui je comprends, c'était juste un exemple).

En fait, ce que je veux faire est la suivante: Après un bouton est pressé, je veux obtenir la valeur de l'accéléromètre (firstValue) puis attendre jusqu'à ce qu'il change (pour dire une valeur particulière par rapport à firstValue), puis passez à faire des tâches. En tant que tel, j'utilisais la boucle while. (La boucle que je montre attend juste qu'elle change, mais je peux mettre la condition de changement exacte requise une fois que cela fonctionne). De votre réponse, je comprends que je peux effectuer la tâche dans le -accelerometer: didAccelerate: fonctionne lui-même (puisqu'il a accès à toutes les données dont il a besoin, je peux lui faire accéder à une variable indiquant si le bouton a été pressé). Merci beaucoup pour ça. Je suppose que je peux le faire fonctionner de cette façon.

Mais juste curieux - est-il possible de le faire autrement? Si trop de traitement accapare le processeur, puis-je le forcer à mettre à jour l'accéléromètre? La boucle monopolisant le CPU lui-même est faible priorité car il était juste ma façon d'attendre jusqu'à ce que les changements de valeur.

Merci encore!

Questions connexes