NSTimer blocages

ldfaldfa Membre
01:36 modifié dans API AppKit #1
Bonjour

Bon je change de section .... ici c'est sûrement mieux.
Pour l'animation d'une NSView, j'utilise un NSTimer pour incrementer la position d'origine de la frame de ma NSView jusqu'a son point de déstination.

2 problèmes:
- Lorsque je clique sur un 'Contrôle' de ma fenêtre, cela bloque le Timer ...
J'ai cherché sur le forum et j'ai trouvé :
http://www.objective-cocoa.org/forum/index.php?topic=1838.msg18233#msg18233
Il faut donc que créer un NSThread pour régler ce problème?

- Lorsque je resize ma fenêtre, cela se complique .... le point de destination n'est plus le bon. Pour le moment je bloque le resize de ma fenêtre pendant l'animation ....
Des pistes pour ne pas bloquer le resize pendant l'animation?

Merci

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur
    01:36 modifié #2
    Salut,
    Pour le 1er point, c'est quand tu restes cliqué sur le controle ou même sur un simple click ? A priori, sur un simple click, y a pas de raison que ton NSTimer soit bloqué.

    Pour le 2eme point, j'aurai tendance à  dire qu'il faut mettre ton controller en delegate de la fenêtre et gérer la méthode qui va bien (genre windowwillresize ou un truc du style). Dans cette méthode, tu récupère les nouvelles dimensions et tu t'arranges pour que la méthode de ton timer les prennent en compte.

    a+
  • ldfaldfa Membre
    01:36 modifié #3
    dans 1170073633:

    Salut,
    Pour le 1er point, c'est quand tu restes cliqué sur le controle ou même sur un simple click ? A priori, sur un simple click, y a pas de raison que ton NSTimer soit bloqué.

    Quand je reste cliqué sur le controle, sur un simple click pas de bloquage.


    Pour le 2eme point, j'aurai tendance à  dire qu'il faut mettre ton controller en delegate de la fenêtre et gérer la méthode qui va bien (genre windowwillresize ou un truc du style). Dans cette méthode, tu récupère les nouvelles dimensions et tu t'arranges pour que la méthode de ton timer les prennent en compte.

    a+

    Oui, cela suppose d'arreter l'animation, et de la reprendre de la position actuelle -> à  la nouvelle position qu'il faut recalculer !!!
    Peut être une meilleur solution ?

    Merci LeChatNoir
  • BruBru Membre
    janvier 2007 modifié #4
    dans 1170064046:

    Pour l'animation d'une NSView, j'utilise un NSTimer pour incrementer la position d'origine de la frame de ma NSView jusqu'a son point de déstination.
    [...]
    - Lorsque je clique sur un 'Contrôle' de ma fenêtre, cela bloque le Timer ...
    J'ai cherché sur le forum et j'ai trouvé :
    http://www.objective-cocoa.org/forum/index.php?topic=1838.msg18233#msg18233
    Il faut donc que créer un NSThread pour régler ce problème?


    Pas besoin de NSThread dans ton cas.
    En fait, je suppose que ton NSTimer est créé via les méthodes scheduledTimerWithTimeInterval:.
    Ce type de NSTimer est déposé dans le runloop en mode "standard" (c'est à  dire que les pseudo événements NSTimer sont lus du runloop en temps normal, quand l'appli ne fait rien).
    Lorsque l'appli est sollicitée par l'UI (notamment pour suivre les mouvements de la souris lorsqu'un contrôle/menu est déclenché), son runloop passe en mode tracking. Cela signifie que seuls les événements spécifiques au suivi de la souris sont acceptés dans le runloop, excluant les autres événements (tels que ceux des NSTimer).

    Tu peux modifier ce comportement en créant a-la-mano ton NSTimer, et en l'ajoutant a-la-mano dans le runloop en spécifiant qu'il doit fonctionner aussi en mode tracking :
    <br />{<br />    NSTimer *timer;<br /><br />    // création du NSTimer<br />    timer=[NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(target:) userInfo:nil repeats:YES];<br /><br />    // ajout du NSTimer dans le runloop avec fonctionnement en mode tracking<br />    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode];<br /><br />    // ajout du même timer, mais en mode normal<br />    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];<br />}<br />
    


    .
  • LeChatNoirLeChatNoir Membre, Modérateur
    01:36 modifié #5
    dans 1170077581:


    Lorsque l'appli est sollicitée par l'UI (notamment pour suivre les mouvements de la souris lorsqu'un contrôle/menu est déclenché), son runloop passe en mode tracking. Cela signifie que seuls les événements spécifiques au suivi de la souris sont acceptés dans le runloop, excluant les autres événements (tels que ceux des NSTimer).




    Ouah cool, je savais pas !!
    MErci Bru  <3
  • UniXUniX Membre
    01:36 modifié #6
    Idem. Très intéressant ...!
  • ldfaldfa Membre
    01:36 modifié #7
    Merci Bru,

    Tu m'évites le NSThread    :)
    Donc cela fonctionne pour l'ensemble des contrôles de ma fenêtre et menus ... mais il reste celui de resizing de la fenêtre qui bloque l'animation.
    Bon j'ai pas verifié si c'est le timer, ou le refraichissement de la fenêtre qui est en cause.
    Pour info j'ai bloqué le resizing pendant l'animation par:
    [[sview window]setMinSize:[[sview window]frame].size]; [[sview window]setMaxSize:[[sview window]frame].size];
    n'ayant pas trouvé mieux une fois la fenêtre crée!!!
    De tout façon c'est pas très grave car j'espère bien trouver une solution pour ne plus bloquer le resizing pendant l'anim.
Connectez-vous ou Inscrivez-vous pour répondre.