Timer qui se gèle

NseaProtectorNseaProtector Membre
06:10 modifié dans API AppKit #1
Bonjour,
Quand j'utilise un NSTimer, mon timer se gèle lorsque j'utilise l'interface de mon projet ! 
Est-ce qu'il y'a une solution, ou bien dois-je faire autrement ?

(Mon but est de faire clignoter "une led" selon un tempo)

Réponses

  • mpergandmpergand Membre
    06:10 modifié #2
    Un peu plus de précisions stp, c'est quoi un timer qui gèle, il ne se déclenche qu'une seule fois ?
  • NseaProtectorNseaProtector Membre
    06:10 modifié #3
    Non, il s'interrompt tant que je tiens le curseur d'un slider par exemple, et après il reprend la ou il en était.
  • mpergandmpergand Membre
    06:10 modifié #4
    Ouais, mais là  le problème, c'est que c'est normal ...

    Peut-être qu'un timer Carbon serait une soluce, mais j'en suis pas sûr  ???
  • schlumschlum Membre
    06:10 modifié #5
    C'est pas bien dur de faire un timer avec un thread sinon...
    Le truc c'est que de toute manière si le Timer touche à  l'interface, il sera bloqué quand même, quelle que soit la méthode utilisée.
  • NseaProtectorNseaProtector Membre
    06:10 modifié #6
    ok, qu'il se bloque dans l'interface encore ...
    Il y'a bien une solution, tout les séquenceurs font ça
  • schlumschlum Membre
    06:10 modifié #7
    En fait, tout ce qui est au niveau de l'interface est géré par le thread principal.
    Donc si on fait un pseudo Timer dans un autre thread qui agit sur l'interface, il fonctionnera mais les événements s'appliquant à  l'interface seront empilés, et dépilés uniquement quand le bouton du slider sera relâché.

    Un NSTimer dans un autre thread devrait fonctionner si le thread a une runloop qui gère les événements...
  • mpergandmpergand Membre
    06:10 modifié #8
    Un thread comme l'a dit schlum.

    Sinon, j'ai utilisé un timer carbon une fois, ça bloque pas quand on manipule les objets de la fenêtre, ça bloque pas quand on navigue dans les menus, par contre ça bloque dès qu'on redimensionne la fenêtre.

    pour installer un timer c'est :
    OSStatus err=InstallEventLoopTimer (GetMainEventLoop (),0.3,.11,NewEventLoopTimerUPP(timerAction),this,&_timer);

    et pour désintaller:
    RemoveEventLoopTimer(_timer);

    (voir la doc)

  • NseaProtectorNseaProtector Membre
    06:10 modifié #9
    Merci les gars, ça marche nickel
    Voila ce que j'ai fait:
    Un timer pour updater l'interface
    et une horloge dans un Thread


    <br />@implementation AppController<br /><br />- (id)init<br />{<br />&nbsp; &nbsp; self = [super init];<br />&nbsp; &nbsp; if (self) <br />	{<br />		// Mise en place de valeur par defaut<br />		intervalTempo = 1250; // ecart pour 120BPM et 25 pas à  la noire.<br />		isRunning = TRUE;<br />//Timer qui update l&#39;interface<br />		bpmTimer = [[NSTimer scheduledTimerWithTimeInterval:0.4<br />													 target:self<br />												&nbsp;  selector:@selector(pulseBpm:)<br />												&nbsp;  userInfo:nil<br />													repeats:YES] retain];<br />		NSLog(@&quot;playNextCue: timer started&quot;);<br />//Thread qui incrémente &quot;mon horloge&quot; en arrière plan<br />		[NSThread detachNewThreadSelector:@selector(tempoClock:)toTarget:self withObject:[bpmText stringValue]];<br />		NSLog(@&quot;Thread started&quot;);<br />		return 0 ;<br />&nbsp; &nbsp; }<br />}<br />- (void) pulseBpm:(NSTimer*)aTimer<br />{<br />//	NSLog(@&quot;Horloge: %f&quot;,clockTempo);<br />//horloge est un NSTextField, clockTempo un float<br />	[horloge setFloatValue:clockTempo];<br />		}<br />//-----------------------------------------------------------<br />//				SECTION DES THREADS<br />//-----------------------------------------------------------<br />#pragma mark -<br />#pragma mark Threads <br />-(void)tempoClock:(NSString *)directoryName<br />{<br />	NSAutoreleasePool	*pool = [[NSAutoreleasePool alloc] init];<br />	// boucle while<br />	// tant que la condition n&#39;est pas remplie, on incrémente l&#39;horloge<br />	while (isRunning == TRUE)<br />	{<br />		clockTempo++;<br />		usleep(intervalTempo);<br />	}<br />	[pool release];<br />	<br />}
    
Connectez-vous ou Inscrivez-vous pour répondre.