Périodicité sans méthode
muqaddar
Administrateur
Salut,
Dans une boucle while toute bête qui affiche du texte, je voudrais mettre un délai de 5 secondes ente chaque passage dans la boucle.
Le timer ne me semble pas adapté ds mon cas
Disons que je veux juste faire une pause ds ma boucle.
Quelle astuce utiliser ?
Dans une boucle while toute bête qui affiche du texte, je voudrais mettre un délai de 5 secondes ente chaque passage dans la boucle.
Le timer ne me semble pas adapté ds mon cas
Disons que je veux juste faire une pause ds ma boucle.
<br />while (...) {<br /> afficheTexte;<br /> pause de 5 secondes le temps de le lire;<br />}
Quelle astuce utiliser ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
.
Si tu fais une boucle pour temporiser tu risque de figer l'appli dans la boucle ...
Si un timer te sembles disproportionné, pourquoi ne pas terminer ta méthode par un:
[grilled] mais je suis pas le seul:
et cette option va figer ton appli dans la boucle sans permettre d'action utilisateur ...
sleep(5);
[Edit] Bru l'homme qui poste plus vite que son ombre
Il apprécie pas du tout, et ça me plante tout.
@ClicCool : j'ai aucune méthode à appeler.
remplaces ta boucle par une méthode exécutant son contenu (1 fois seulement).
devient:
Même en rajoutant #include <unistd.h> ?
.
Mais bon, peut-être que j'interprète mal :brule:
Mais bon, j'avais à peu près compris
Pareil...
J'ai essayé un timer, je pense que ça pourrait marcher, mais y'a un pb avec invocation :
Etrange ... c'est à la compil que ca ne passe pas ? à l'exécution ? un log du crash ?
invocation est un objet de type NSInvocation (fort puissant concept que celui là ).
Tu sembles confondre avec la target, utilises alors la méthode: timerWithTimeInterval:target:selector:userInfo:repeats:
et ça me renvoie :
*** NSTimer discarding exception 'NSInvalidArgumentException' (reason '*** -[Controller methodSignatureForSelector:]: null selector') that raised during firing of timer with target 341e50 and selector '(null)'
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:(NSTimeInterval)5.0]];
...mais j'aimerais bien comprendre pourquoi "sleep" ne fonctionne pas chez toi .
Ben oui si tu mets selector:nil, il te dit que selector est nil et qu'il aime pas ça du tout
Faut dire au timer quelle méthode il doit executer quand il se lance.
(comme je te proposait de le faire plus simplement avec performSelector: ... )
C'est la méthode que j'utilise pour éviter l'apparition de la roue de la mort...
Code Java, pas sûr que ça soit transposable directement en ObjC
Peut-être parce que j'appelle la méthode qui contient la boucle en question ds le awakeFromNib, qui plus est par un timer !!!
Ds le awake :
[code] mailsTimer = NSTimer scheduledTimerWithTimeInterval:15 target:self selector:@selector(checkMailsFromApp:) userInfo:nil repeats:YES] retain]; <br /> [mailsTimer fire]; [/code]<br /><br />[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:(NSTimeInterval)5.0;
me donne le même résultat que sleep(5);
C'est fou, il doit bien y avoir une solution sans créer de méthode en plus !
Je viens de tester ici dans cette configuration et cela ne pose pas de problème ... tu as quelque chose dans la consol log ? ca crash ?
Appel d'une méthode ds un timer toutes les 30 secondes
Puis la méthode :
Note : La pause de 5 secondes doit etre faite ds la première boucle while. J'ai enlevé le code qui ne vous sert pas.
Tu prends pas le risque que tout se téléscope là :
Ta méthode d'épluchage des mails est appelée toutes les 30 seçondes et elle même fait une pause de 5 seconde à chaque message ...
S'il y a + de 6 mesages ça lui fait une pause > 30 seçondes et checkMailsFromApp va donc être appelée alors qu'elle n'a pas finie ???
1) je fais le test avec 2 mails seulement pour l'instant
2) ensuite quand ça marchera je bidouillerai un truc avec une variable d'instance pour détruire le second timer et éviter le télescopage.
Mais pour l'instant, ça foire, même avec 2 mails.
J'ai mis le timer principal dans le init à la place du awakeFromNib et la plus de problème.
Même avec un sleep(5) !
Encore merci à tous.
EDIT : ça marche mais c'est super lent.
un peu comme si ton appli faisait des pauses successives de 5 sec ? :P
:)beta:
y'a la roue multicolore qui tourne irrégulièrement, c'est du au sleep ?
Il me semble que oui en effet
Si tu mets une boucle avec sleep dans le thread principal, le thread principal roupille et ton application avec ...
Si ta boucle dormante est dans un autre thread alors ton appli devrait rester réactive.
ET je crois bien que tu as mis ton sleep à l'envers ;D
[EDIT] désolé, finalement j'ai pas pu résister :P
J'ai essayé la technique de amnesic, mais c pareil :
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:(NSTimeInterval)3.0]];
Oui en effet ce doit être pareil, le thread principal est endormis, la runLoop est là encore shuntée et non parcourue et ton appli semble donc bloquée.
http://www.objective-cocoa.org/forum/index.php?topic=722.msg8033#msg8033
;D ;D
C'est tout à l'envers... ou l'obj-C est tout à l'envers...
La question est : est-ce qu'un timer dans un timer entraà®ne la roue de la mort ou la roue de la fortune ?