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?
0
A
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.
Questions connexes
- 1. AlarmManagerIntent ne soit pas appelé
- 2. Delphi - WndProc() dans le thread n'a jamais appelé
- 3. TaskScheduler.UnobservedTaskException ne sera jamais appelé
- 4. onIabPurchaseFinishedListener ne sera jamais appelé
- 5. Méthode ne sera jamais appelé
- 6. Est-il possible de configurer Grails pour ne jamais modifier un objet de domaine à moins que .save() soit appelé?
- 7. TapGestureRecognizer ne soit pas appelé
- 8. tordu: vérifier si un différé a déjà été appelé
- 9. netStatusHandler ne sera jamais appelé (Flash CS5)
- 10. iOS: Méthode rootController ne soit pas appelé
- 11. Android IntentService n'a jamais appelé
- 12. onLocationChanged() jamais appelé dans Android
- 13. rappel MongoClient jamais appelé
- 14. surfaceCreated() Jamais appelé
- 15. onActivityResult() est jamais appelé
- 16. dictationRecordingDidEnd n'a jamais appelé
- 17. App OnStartup ne sera jamais appelé
- 18. validModesForFontPanel jamais appelé
- 19. applicationWillEnterForeground jamais appelé
- 20. prepareForSegue n'a jamais appelé
- 21. appel à une méthode ne retourne jamais
- 22. Request_Begin n'a jamais appelé
- 23. Firebase onTokenRefresh() jamais appelé
- 24. inviteHandler n'a jamais appelé
- 25. fbdidLogin jamais appelé
- 26. shouldStartLoadWithRequest n'est jamais appelé
- 27. onPageFinished() jamais appelé (webview)!
- 28. viewWillAppear est jamais appelé
- 29. Ajax.ActionLink OnComplete jamais appelé
- 30. Django get_context_data n'est jamais appelé dans MyCustomTemplateView?
@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
@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. :) –
@MarcusAdams Ah .. OK. Mon malentendu. – bbum