[Résolu] NSTextView plantage lors de l'ajout de texte

wiskywisky Membre
avril 2011 modifié dans API AppKit #1
Bonjour à  tous,

En ce moment j'ai pas mal de colle pour vous !

En voici une nouvelle :

Lorsque j'ajoute du texte en grande quantité et rapidement dans ma sous classe de NSTextView cela fait planté mon logiciel.

!!! _NSLayoutTreeSetLineFragmentRectForGlyphRange found invalid glyph index
!!! _NSLayoutTreeSetLocationForGlyphRange invalid glyph range {55960, 5}


Avant cette erreur, la longueur du texte était de 55960 caractères.

J'ai déjà  essayé de ralentir l'ajout des données avec un tampon mais ça n'y fait rien !

Ma question est, comment régler cela ?

Réponses

  • wiskywisky Membre
    12:37 modifié #2
    Cela me dépasse...

    Si au lieu d'afficher le texte dans la NSTextView je me contente de stocker les données dans une NSMutableString, ça ne plante pas !
    Donc maintenant, comment régler la barre de-défilement pour simuler la présence de tout le texte sans pour autant ajouter tout le texte dans le NSTextView.
    Pour infos, j'arrive à  des tailles de près de 10Mo de texte dans la NSMutableString. Donc pour des raisons de performance, je préfèrerais gérer moi même l'ascenseur et n'afficher effectivement que le contenue visible. Ainsi les performances seront meilleur (je l'espère).
  • devulderdevulder Membre
    12:37 modifié #3
    dans 1302637012:

    Bonjour à  tous,

    En ce moment j'ai pas mal de colle pour vous !

    En voici une nouvelle :

    Lorsque j'ajoute du texte en grande quantité et rapidement dans ma sous classe de NSTextView cela fait planté mon logiciel.

    !!! _NSLayoutTreeSetLineFragmentRectForGlyphRange found invalid glyph index
    !!! _NSLayoutTreeSetLocationForGlyphRange invalid glyph range {55960, 5}


    Avant cette erreur, la longueur du texte était de 55960 caractères.

    J'ai déjà  essayé de ralentir l'ajout des données avec un tampon mais ça n'y fait rien !

    Ma question est, comment régler cela ?


    Bonjour,

    Teste avec ca

    <br /><br />[[myTextView textStorage] mutableString] appendString:@&quot;mon mega texte...&quot;];<br /><br />
    


  • wiskywisky Membre
    12:37 modifié #4
    Je viens de tester et c'est la même chose.

    J'ai un début de piste avec usleep(500) qui ne semble pas fonctionner.
    En effet, si je met dans la boucle qui ajouter les données un sleep(1) le plantage ne se fait pas. Même si j'ajoute 1Mo à  chaque fois.
    Par contre, usleep(500) ne fonctionne pas. La pause de 0.5 seconde n'est pas faite. Ce qui fait au final que le logiciel vas le plus vite possible et comme c'est dans deux thread séparé, ça fini par planter l'affichage.

    Y-a-t-il quelque chose que je ne fait pas bien dans l'utilisation de usleep() ?
  • wiskywisky Membre
    12:37 modifié #5
    J'ai remplacer l'exécution dans un thread séparé par un timer. Cela fonctionne très bien et le plantage à  disparu !
  • laudemalaudema Membre
    12:37 modifié #6
    dans 1302682586:

    Cela me dépasse...

    Si au lieu d'afficher le texte dans la NSTextView je me contente de stocker les données dans une NSMutableString, ça ne plante pas !

    Assez logique dans la mesure ou le NSLayoutManager n'est pas appelé pour une NSAttributedString tant qu'elle n'est pas affichée !
    Peut être que revenir au NonContiguousLayout peut aider ?

  • wiskywisky Membre
    12:37 modifié #7
    Au final, j'utilise insertText en espacant les insertions. ça marche bien pour le moment.
  • laudemalaudema Membre
    12:37 modifié #8
    dans 1302702059:

    .... ça marche bien pour le moment.


    C'est plus par curiosité que je proposais ContiguousLayout, et pour tenter d'expliquer pourquoi dans une NSMutableAttributedString "ça plante pas"
    Peut être qu'Apple serait intéressé à  connaà®tre le Bug ?


    Qu'importe le flacon pourvu qu'on ait l'ivresse  :p

  • wiskywisky Membre
    12:37 modifié #9
    Effectivement je vais essayer de creuser pour le cas ou il y a un gros documents en mémoire.

    En fait, ça plantait à  cause du fait que je tentait d'ajouter des données alors que le système n'avais pas fini de rafraichir la vue. Du coup il se perdait un peux dans ses objets ça crashait.

    Au final, je vais voir si je peux pas encore gagner en performance. C'est toujours ça de pris ;)
  • laudemalaudema Membre
    12:37 modifié #10
    Il faut reconnaitre que le système de texte de Cocoa n'est pas simple mais il permet d'afficher (dessiner ?) à  peu près n'importe quel texte sous n'importe quelle forme, c'est loin d'être évident dès qu'on rentre dans les détails :(
  • wiskywisky Membre
    12:37 modifié #11
    C'est vrais que c'est simple pour des truc simple, mais la contre partie c'est que ça complique tout quand tu veux pousser les perfs au max. Mais ça reste faisable ;)

    J'aimerais respecter un certain débit pour la réception et l'envoie, comment calculer le temps d'attente entre chaque paquet de donnée pour atteindre le débit max ?

    Ex: vitesse 12,9Kb/s combien entre chaque caractères ? 1/12900 ?
Connectez-vous ou Inscrivez-vous pour répondre.