2011-11-08 3 views
0

J'essaie d'apprendre à propos de NSTimer, en utilisant Foundation et l'impression à la console. Quelqu'un peut-il me dire ce que je dois faire pour que les choses suivantes fonctionnent? Il compile sans erreurs, mais n'active pas ma méthode startTimer - rien ne s'imprime.Comment faire pour NSTimer à la boucle

Mon but est d'obtenir une méthode pour appeler une autre méthode pour exécuter certaines instructions, puis arrêter après un temps défini.

#import <Foundation/Foundation.h> 

@interface MyTime : NSObject { 
    NSTimer *timer; 
} 
- (void)startTimer; 
@end 

@implementation MyTime 

- (void)dealloc { 
    [timer invalidate]; 
    [super dealloc]; 
} 

- (void)startTimer { 
    timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(runTimer:) userInfo:nil repeats:YES]; 
} 

- (void)runTimer:(NSTimer *)aTimer { 
    NSLog(@"timer fired"); 
} 
@end 


int main(int argc, char *argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 


    MyTime *timerTest = [[MyTime alloc] init]; 
    [timerTest startTimer]; 

    [timerTest release]; 

    [pool release]; 
    return 0; 
} 
+0

Veuillez récompenser les personnes qui vous ont aidé dans le passé et accepter les réponses à votre ancienne question. – DarkDust

Répondre

-1

Vous devez ajouter votre minuterie à la runloop par défaut après l'initialiser:

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

Mettre cela dans -(void)startTimer.

+0

Je viens de copier et coller cela dans le - (void) startTimer mais il ne fonctionne toujours pas. S'il est placé au-dessus de l'instruction timer, il ne fait rien comme avant. Si placé ci-dessous, je reçois un fil! mauvaise erreur. Qu'est-ce qui suggère semble bon - pourriez-vous essayer à nouveau? merci Tim. – pete

+1

Placer ci-dessous est le bon endroit pour le mettre. Le problème est que dans votre programme vous lancez la minuterie, puis relâchez immédiatement l'objet qui la contient et qu'elle est toujours dans la boucle de lancement, donc quand elle est appelée, l'objet sur lequel elle opère (dans ce cas 'testTimer') est déjà parti c'est pourquoi vous obtenez une erreur. – Tim

+1

Ceci n'est correct que si vous n'utilisez pas la famille de classes scheduledTimer qu'il utilise. – logancautrell

6

La minuterie ne devient jamais une chance de tirer dans votre programme, parce que le le programme se termine presque immédiatement après la création de la minuterie.

Il existe un construit appelé Run Loop qui est responsable du traitement des entrées, y compris l'entrée des temporisateurs. Une boucle d'exécution est créée pour chaque thread, mais elle n'est pas démarrée automatiquement dans ce cas.

Vous devez exécuter la boucle d'exécution et la maintenir jusqu'à ce que la minuterie ait une chance de tirer. Heureusement, c'est assez facile. Insérer:

[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5.0]]; 

entre l'envoi startTimer et release à timerTest. Si vous voulez répéter la minuterie, vous devez continuer à maintenir la boucle d'exécution active.

Notez que vous n'avez besoin de faire cela que dans un programme simple comme celui-ci; Lorsque vous créez une application avec une interface graphique, la boucle d'exécution sera démarrée via le processus d'installation de l'application Cocoa et restera active jusqu'à la fin de l'application.

+0

Je ne pense pas qu'il soit juste de dire "quand la fonction principale se termine, la boucle d'exécution s'arrête aussi". Je veux dire, il est vrai que le programme qui sortira terminera le runloop, mais ce n'est pas le problème ici.Dans cet exemple particulier, aucun runloop n'est jamais démarré. – Chuck

+0

@Chuck: J'étais en train d'essayer de résoudre ce problème tout à l'heure. J'avais l'impression que la boucle a été démarrée automatiquement par le thread [NS?], Mais je suppose que c'est fait par AppKit? –

+0

Chaque NSThread * possède * une boucle de lancement, mais elle ne s'exécute pas jusqu'à ce qu'on le lui dise. Dans une application Cocoa normale, la boucle principale est exécutée par 'NSApplicationMain()'. Je pense que c'est ce à quoi il fait référence dans les docs quand il dit que la fonction "exécute l'application". – Chuck