2013-07-26 1 views
0

Dites que vous attachez une minuterie à une boucle de lancement dans un thread particulier, mais que le thread s'est terminé avant que le minuteur ne se déclenche, ce qui empêche l'exécution de la méthode. Ce scénario est-il possible?Est-il possible qu'un appel différé ne soit jamais appelé dans un thread?

+1

@MarcusAdams Une minuterie se déclenche sur le passage suivant dans la boucle de l'événement si le temps requis est écoulé. Ça ne tardera jamais jusqu'à la prochaine fois. – bbum

+0

@bbum, je pensais répéter des minuteries. Les événements de minuterie peuvent être ignorés s'ils sont trop retardés. J'ai supprimé mon commentaire. Par "appel différé", nous ne parlons probablement pas de minuteries répétées. :) –

+0

@MarcusAdams Ah .. OK. Mon malentendu. – bbum

Répondre

3

Certainement c'est possible, et c'est assez facile à démontrer.

#import <Foundation/Foundation.h> 

#define TIMER_INTERVAL 2.0 

@interface Needle : NSObject 

- (void)sew; 
- (void)tick:(NSTimer *)tim; 

@end 

@implementation Needle 
{ 
    NSTimer * tim; 
} 

- (void)sew 
{ 
    @autoreleasepool{ 
     tim = [NSTimer scheduledTimerWithTimeInterval:TIMER_INTERVAL 
               target:self 
              selector:@selector(tick:) 
              userInfo:nil 
               repeats:NO]; 

     while(![[NSThread currentThread] isCancelled]){ 
      [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; 
     } 
    } 
} 

- (void)tick:(NSTimer *)timer 
{ 
    NSLog(@"Let's get the bacon delivered!"); 
    [[NSThread currentThread] cancel]; 
} 

@end 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     Needle * needle = [Needle new]; 
     NSThread * thread = [[NSThread alloc] initWithTarget:needle 
                selector:@selector(sew) 
                 object:nil]; 

     [thread start]; 
     // Change this to "+ 1" to see the timer fire. 
     NSTimeInterval interval = TIMER_INTERVAL - 1; 
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:interval]]; 
     [thread cancel]; 

    } 
    return 0; 
} 
+0

+1 pour l'illustration du code. – Boon

0

Oui, sauf si vous êtes sur le thread principal, il n'y a pas de NSRunLoop pour garder le thread en vie et pour que les minuteurs s'y attachent. Vous devrez en créer un et le laisser fonctionner.

0

Oui c'est. Cela arrive assez facilement, s'il y a une minuterie mais l'application quitte "prématurément". Dans ce cas, la date de déclenchement de la minuterie sera perdue, même si l'application est redémarrée avant la date de déclenchement de la minuterie précédemment définie.