2009-03-18 11 views
2

Je suis en train de lire les données d'un flux (fourni par un processus) caractère par caractère et de l'ajouter à une zone de texte afin que l'utilisateur puisse voir. Le seul problème est, c'est SLOW. L'utilisateur doit voir les données telles qu'elles sont données au programme (avec peu ou pas de retard). Je voudrais quelque chose comme la façon dont les terminaux traitent le texte, il peut défiler si vite que c'est un flou.Lecture de beaucoup de caractères et mise à jour d'une zone de texte

Comment puis-je améliorer cela?

Pour référence, j'utilise C# .net3.5 et winforms.

Répondre

2

La propriété Text de la zone de texte est un chaîne, et les chaînes sont immuables (ce qui signifie que vous ne pouvez pas changer de chaîne). Cela signifie qu'à chaque fois que vous ajoutez un caractère, vous créez une nouvelle copie de la chaîne avec un caractère ajouté à la fin.

Si vous avez par exemple 10 000 caractères dans la zone de texte, vous copiez 20 Ko de données pour ajouter le caractère suivant. Ajouter une centaine de caractères un à la fois signifie copier 2 Mo de données. Si les données sont basées sur une ligne, utilisez une liste au lieu d'une zone de texte, de sorte que vous ne devez mettre à jour la dernière ligne que lorsque vous ajoutez un caractère.

0

Un code aiderait à comprendre ce qu'est le goulot d'étranglement.

Cela dit, je vais essayer quelque chose dans ce sens (je ne dirais pas copier/coller que je ne peux pas tester ici):

// Stream s... 
byte[] buffer = new buffet[bufferSize]; 
s.BeginRead(b, 0, buffer.Length, 
    delegate 
     { 
      if (textBox1.InvokeRequired) 
      { 
       textBox1.Invoke(
        new MethodInvoker(
         delegate 
         { 
          textBox1.Text = Encoding.Unicode.GetString(b); 
         })); 
      } 
      else 
      { 
       textBox1.Text = Encoding.Unicode.GetString(b); 
      } 
     }, null); 
1

Dans une zone de texte multiligne vous obtiendrez des performances légèrement meilleures en utilisant la sélection pour ajouter: caractères

textBox1.Select(textLength, 0); 
textBox1.Selectedtext = newText; 
textLength += newText.Length; 

Mais comme vous pouvez le voir, vous devrez suivre la longueur vous et cette méthode sera probablement briser si vous autorisez control-chars (comme backspace).

Je recommanderais l'idée de Guffa d'utiliser d'abord une liste.

Questions connexes