2010-02-23 9 views
0

J'utilise le pont de script pour interroger iTunes à partir de mon application de cacao. Parfois, iTunes affiche une fenêtre (comme si un iPod devait être mis à jour, etc.) et pendant que cette fenêtre est ouverte, je ne peux obtenir aucune information d'iTunes. Donc, si je demande des informations à iTunes quand il est dans cet état, mon application se bloque complètement jusqu'à ce que cette fenêtre popup soit fermée.Exécutez le code pendant un certain laps de temps et tuez si nécessaire

J'ai donc besoin d'une sorte de mécanisme où je peux demander à itunes quelque chose de simple dans un thread séparé pour voir si je peux obtenir une réponse de celui-ci ... et si ce thread séparé ne reçoit pas de réponse dans une courte période de temps mon fil principal va simplement tuer ce fil et donc ne pas interroger iTunes à ce moment-là.

Des idées comment créer un tel mécanisme? J'ai cherché des moyens de tuer un fil mais je n'en ai trouvé aucun.

Répondre

1

Votre problème n'a rien à voir avec les threads; c'est que votre délai d'attente est trop long. Tout ce que vous faites devrait échouer après environ une minute.

Pour résoudre ce problème, envoyez un message setTimeout: à the SBApplication object en indiquant le délai d'attente. La valeur est en ticks, dont il y a exactement 60 par seconde. (Certaines sources disent 60,15, et les docs d'Apple disent "environ" 60, mais je viens de mesurer dix minutes de TickCount, et le résultat de la division de 600 secondes est exactement 60,0. Le code que j'ai utilisé:
NSLog(@"Ticks per second: %f", (end - start)/(60.0 * numMinutes));end et start sont les résultats de TickCount.)

+0

Wow Peter, merci beaucoup. C'est ça! Je n'ai jamais attendu assez longtemps pour que le délai expire. Je l'ai testé sans ajuster la valeur et cela prenait 2 minutes à l'expiration. Ensuite, j'ai pris votre suggestion et réglé le délai à 300 ticks (c'est-à-dire 5 secondes) et bien sûr, il a expiré en 5 secondes et l'interface de mon application a été de nouveau utilisable. Cela rend ma vie tellement plus facile, merci encore pour le pourboire! – regulus6633

0

Vérifiez NSOperation/NSOperationQueue.

+0

Merci mais je regardé cela. NSOperation a la même commande "cancel" que NSThread et donc le même problème ... que si "l'opération" est bloquée, il n'aura jamais une chance de vérifier si elle a été annulée et donc ne disparaîtra jamais. J'ai besoin d'un moyen de le tuer, pas l'annuler. J'ai une solution mais je ne l'aime pas. Je lance une commande d'applescript en utilisant osascript dans un NSTask. Je crée la tâche, l'exécute dans un thread séparé, puis vérifie si la tâche est exécutée depuis mon thread principal. Si elle fonctionne encore après un court laps de temps, je l'interromps, ce qui tue la tâche et je sais ne pas interroger iTunes. – regulus6633

+0

Je voudrais toujours trouver une solution NSThread parce que le NSTask utilisant une commande osascript a plus de frais que nécessaire, donc toutes les autres solutions sont les bienvenues. – regulus6633