Affichage dans NSTextView

Nyx0ufNyx0uf Membre
18:40 modifié dans API AppKit #1
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é)
<br />-(IBAction)Connect:(id)sender<br />{<br />&nbsp; &nbsp; &nbsp; &nbsp; while (!CONNECT_OK)<br />	{<br />		memset(buffer, 0x00, BUFFLEN); // Initialisation du buffer<br />		buffsize = recv(c-&gt;GetSocket(), buffer, BUFFLEN, 0); // Reception de la reponse du server<br />		if (-1 == buffsize) return;<br />		if (strstr(buffer, &quot;PING :&quot;))<br />		{<br />			[displayField insertText:[NSString stringWithCString:buffer]];<br />			buffer[1] = &#39;O&#39;; // Remplacement du I par un O<br />			send(c-&gt;GetSocket(), buffer, strlen(buffer), 0); // Renvoie du numero de verification (PONG :xxx)<br />			[displayField insertText:[NSString stringWithCString:buffer]];<br />		}<br />		string VERIF = &quot;MODE &quot;; // Chaine de verification de la connexion<br />		VERIF += &quot;NyxemTEST&quot;;<br />		VERIF += &quot; +i&quot;;<br />		if (strstr(buffer, VERIF.c_str()))<br />		{<br />			send(c-&gt;GetSocket(), AUTH.c_str(), AUTH.size(), 0); // Envoie de l&#39;AUTH<br />			memset(buffer, 0x00, BUFFLEN); // Re-initialisation du buffer<br />			buffsize = recv(c-&gt;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 = &quot;JOIN &quot;; // Chaine contenant les chans a rejoindre<br />			JOIN_CHANS += &quot;#funpickup&quot;;<br />			JOIN_CHANS += &quot;&#092;r&#092;n&quot;;<br />			send(c-&gt;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-&gt;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 />

Réponses

  • AliGatorAliGator Membre, Modérateur
    novembre 2007 modifié #2
    Hello,

    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)
Connectez-vous ou Inscrivez-vous pour répondre.