IBAction qui freeze mon app

Salut à  tous,



J'ai un petit soucis avec mon code. Il s'agit d'une application qui envoie du "artnet" qui est un protocole réseau (c'est comme du midi mais pour les éclairages professionels)



j'ai une IBaction rattachée à  un bouton qui doit m'envoyer un message artnet via mon réseau wifi et un slider qui change un paramètre de ce message.



le signal artnet doit être envoyé en continue dans le réseau wifi mais son contenu doit pouvoir évolué en fonction de la position de mon slider



mon problème c'est que le code qui suit envoie bien le message artnet avec la valeur de position de mon slider, mais une fois lancée l'IBaction m'empêche de modifier la position de mon slider. Le message est bien envoyer en continue, la position initiale du slider est prise en compte mais je pense que ça boucle et ne aucune autre action n'est possible.



si une âme charitable pouvait se pencher sur mon problème.

d'avance, merci



voici le code :






-(IBAction)startartnet

{

artnet_node *artnetNode = artnet_new(ip_addr, 1);

artnet_set_long_name(artnetNode, "ArtPAD");

artnet_set_short_name(artnetNode, "AP");

artnet_set_subnet_addr(artnetNode, subnet_addr) ;

artnet_set_port_type(artnetNode, 0, ARTNET_ENABLE_OUTPUT, ARTNET_PORT_DMX) ;

artnet_set_port_addr(artnetNode, 0, ARTNET_OUTPUT_PORT, port_addr);



if (artnet_start(artnetNode) != 0) {

printf("Error: %s\n", artnet_strerror());

exit(-1);

}



while (YES) {

artnet_send_poll(artnetNode, NULL, ARTNET_TTM_DEFAULT);



int a = 3;

int b = slider1.value;

uint8_t dmxcolor=#2500d8]512[/color = {0};

dmxcolor=#2500d8]9[/color = 127;

dmxcolor=#2500d8]19[/color = 127;

dmx[a] = b;

artnet_send_dmx(artnetNode, 1, sizeof(dmx), dmx);

}

}

Réponses

  • LarmeLarme Membre
    février 2013 modifié #2
    Euh... le While(YES) semble tourner en continu quand même... Du coup, ton code reste dedans... Car je ne décèle pas de multithreading.

    Je ferais autrement...

    J'aurais un NSTimer qui fire sur un méthode qui dialogue en continue avec, en ayant un paramètre en fonction de la position du slider ?
  • Je commence tout juste le code de cette appli, et je vais avoir pas mal d'autres sliders plus des zones de texte qui seront elles aussi prisent en compte dans le message artnet.

    au fait, je suis gros débutant sous Xcode, aurais-tu un exemple à  me proposer pour le NSTimer car je n'ai jamais utilisé.

    Merci beaucoup pour ton aide
  • LarmeLarme Membre
    février 2013 modifié #4
    Je ferais :


    [color=#460085][font=Menlo][size=2][color=#3d8389]timerEnvoi[/color][color=#000000] = [[/color][color=#7c1fae]NSTimer[/color][color=#000000] [/color]scheduledTimerWithTimeInterval[color=#000000]:[/color][color=#3800df]1.0[/color][/size][/font][/color]<br />
    [font=Menlo][size=2]  [color=#460085]target[/color]:[color=#cd00a5]self[/color][/size][/font]<br />
    [font=Menlo][size=2][color=#460085]selector[/color]:[color=#cd00a5]@selector[/color](envoyerMessage)[/size][/font]<br />
    [font=Menlo][size=2][color=#460085]userInfo[/color]:[color=#cd00a5]nil[/color][/size][/font]<br />
    [font=Menlo][size=2][color=#460085]repeats[/color]:[color=#cd00a5]YES[/color]];[/size][/font]
    



    [font=Menlo][size=2]-(void)envoyerMessage[/size][/font]<br />
    [font=Menlo][size=2]{[/size][/font]<br />
    [font=Menlo][size=2]// Récupération de la valeur du slider désiré[/size][/font]<br />
    [font=Menlo][size=2]//tonMachinArtnet envoi[/size][/font]<br />
    [font=Menlo][size=2]}[/size][/font]
    


    Pour arrêter ton timer :

    [timerEnvoi invalidate];<br />
    timerEnvoi = nil;
    
  • j'ai le droit à  un "use of undeclared identifier self"...

    une idée?
  • LarmeLarme Membre
    février 2013 modifié #6
    T'as pas utiliséle NSTimer dans une fonction et non pas une méthode ?
  • jeffadsljeffadsl Membre
    février 2013 modifié #7
    Avec le code ci-dessous, je n'ai plus erreur, mais ça boucle toujours

    j'ai crée un bouton ON avec la fonction timer qui déclenche "-(IBAction)startartnet"

    et un bouton OFF pour arrêter le timer




    -(IBAction)on

    {

    timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(startartnet) userInfo:nil repeats:YES];

    }



    -(IBAction)off

    {

    /color][color=#508187]timer[/color][color=#000000] [/color]invalidate[color=#000000;

    timer = nil;

    }





    -(IBAction)startartnet

    {

    artnet_node *artnetNode = artnet_new(ip_addr, 1);

    artnet_set_long_name(artnetNode, "ArtPAD");

    artnet_set_short_name(artnetNode, "AP");

    artnet_set_subnet_addr(artnetNode, subnet_addr) ;

    artnet_set_port_type(artnetNode, 0, ARTNET_ENABLE_OUTPUT, ARTNET_PORT_DMX) ;

    artnet_set_port_addr(artnetNode, 0, ARTNET_OUTPUT_PORT, port_addr);





    if (artnet_start(artnetNode) != 0) {

    printf("Error: %s\n", artnet_strerror());

    exit(-1);

    }



    while (YES) {

    artnet_send_poll(artnetNode, NULL, ARTNET_TTM_DEFAULT);

    int a = 3;

    int b = slider1.value;

    uint8_t dmxcolor=#2500d8]512[/color = {0};

    dmxcolor=#2500d8]9[/color = 127;

    dmxcolor=#2500d8]19[/color = 127;

    dmx[a] = b;

    artnet_send_dmx(artnetNode, 1, sizeof(dmx), dmx);

    }

    }


  • Plus la peine de mettre un while du coup vu que la répétition se fait déjà  au niveau de la méthode entière.



    T'es motivé ! SdZ + Ici !
  • AliGatorAliGator Membre, Modérateur
    février 2013 modifié #9
    Je te conseille très fortement d'aller un peu bouquiner sur les concepts suivants, sans quoi tu vas rapidement aller dans le mur :

    - Lire le Stream Programming Guide

    - Multithreading (lire les Programming Guides associés)

    - Concepts de code synchrone et asynchrone

    - Concept d'attente active (à  éviter à  tout prix), d'attente passive (bien mieux et non bloquante)

    - Timers, RunLoop
  • Ca Marche[font=helvetica, arial, sans-serif]![/font][font=helvetica, arial, sans-serif]![/font][font=helvetica, arial, sans-serif]![/font][font=helvetica, arial, sans-serif]![/font][font=helvetica, arial, sans-serif]![/font][font=helvetica, arial, sans-serif]![/font]

    [font=helvetica, arial, sans-serif]Avec timer et le [/font][font=helvetica, arial, sans-serif]while retiré [/font]

    [font=helvetica, arial, sans-serif]et le code corrigé[/font]

    [font=helvetica, arial, sans-serif]Merci @ tous[/font]
Connectez-vous ou Inscrivez-vous pour répondre.