Affichage dans NSTextView
Nyx0uf
Membre
Bonjour,
J'ai un NSTextView dans lequel je voudrais afficher du texte à partir d'une boucle. Le problème est que le NSTextView (displayField) est mis-à -jour seulement lorsque que l'on sort de la méthode Connect.
Comment faire pour afficher le texte au fur et à mesure (besoin de threads ou non?)
Voici le code (simplifié)
J'ai un NSTextView dans lequel je voudrais afficher du texte à partir d'une boucle. Le problème est que le NSTextView (displayField) est mis-à -jour seulement lorsque que l'on sort de la méthode Connect.
Comment faire pour afficher le texte au fur et à mesure (besoin de threads ou non?)
Voici le code (simplifié)
<br />-(IBAction)Connect:(id)sender<br />{<br /> while (!CONNECT_OK)<br /> {<br /> memset(buffer, 0x00, BUFFLEN); // Initialisation du buffer<br /> buffsize = recv(c->GetSocket(), buffer, BUFFLEN, 0); // Reception de la reponse du server<br /> if (-1 == buffsize) return;<br /> if (strstr(buffer, "PING :"))<br /> {<br /> [displayField insertText:[NSString stringWithCString:buffer]];<br /> buffer[1] = 'O'; // Remplacement du I par un O<br /> send(c->GetSocket(), buffer, strlen(buffer), 0); // Renvoie du numero de verification (PONG :xxx)<br /> [displayField insertText:[NSString stringWithCString:buffer]];<br /> }<br /> string VERIF = "MODE "; // Chaine de verification de la connexion<br /> VERIF += "NyxemTEST";<br /> VERIF += " +i";<br /> if (strstr(buffer, VERIF.c_str()))<br /> {<br /> send(c->GetSocket(), AUTH.c_str(), AUTH.size(), 0); // Envoie de l'AUTH<br /> memset(buffer, 0x00, BUFFLEN); // Re-initialisation du buffer<br /> buffsize = recv(c->GetSocket(), buffer, BUFFLEN, 0); // Reponse du server<br /> if (-1 == buffsize) return;<br /> [displayField insertText:[NSString stringWithCString:buffer]];<br /> if (-1 == buffsize) return;<br /> [displayField insertText:[NSString stringWithCString:buffer]];<br /> string JOIN_CHANS = "JOIN "; // Chaine contenant les chans a rejoindre<br /> JOIN_CHANS += "#funpickup";<br /> JOIN_CHANS += "\r\n";<br /> send(c->GetSocket(), JOIN_CHANS.c_str(), JOIN_CHANS.size(), 0); // Envoie de la demande de connexion aux chans<br /> memset(buffer, 0x00, BUFFLEN); // Re-initialisation du buffer<br /> buffsize = recv(c->GetSocket(), buffer, BUFFLEN, 0); // Reponse du server<br /> if (-1 == buffsize) return;<br /> [displayField insertText:[NSString stringWithCString:buffer]];<br /> CONNECT_OK = TRUE; // On sort de la boucle<br /> }<br /> }<br />}<br />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
L'affichage est fait dans le thread principal (à chaque runLoop, sur les objets dont le setNeedDisplay a été mis à YES). Donc forcément tant que tu es dans ton code "connect" que tu nous as mis ici, il ne pourra pas faire autre chose (entre autres raffraà®chir l'affichage).
les deux solutions possibles : faire un appel explicite à une méthode qui va, de manière synchrone, forcer l'affichage au moment où on l'appelle -- mais ça c'est déconseillé dans les docs Apple -- ou (et ça c'est la bonne solution) faire un thread séparé du thread principal pour que le thread gérant l'affichage (qui est obligatoirement le thread principal) soit indépendant de ta boucle d'attente.
Conclusion : mettre ton code de connect dans un thread séparé, et utiliser la fameuse méthode [tt]performSelectorOnMainThread:[/tt] dont on a déjà parlé ici pour tes appels à tes méthodes de dessin (tu peux faire une recherche sur les forums sur cette méthode si tu veux plus d'infos, entre autres ce topic)