2009-07-16 13 views
0

Ich habe ein Problem mit dem Speichern von erstaunlichen Mengen an Text in einem Rich TextBox.richTextBox Anzahl der Zeichen?

Ich versuche, eine Textdatei ziemlich groß zu lesen (irgendwo von 90mb bis 450mb), und legte, was ich in einem reichen Textfeld gelesen habe. Es funktioniert in einem einfachen Programm, aber wenn ich in einem komplizierten Programm mache, bekomme ich eine OutOfMemory-Ausnahme.

Eine Sache zu beachten ist, dass, wenn ich mein einfaches Programm beenden, erhalte ich eine OutOfMemory Ausnahme rechts, bevor das Programm 0 zurück

Hier ist mein einfaches Code-Programm:

array<String^>^ strArray; 
    StreamReader^ sr; 
    String^ dummyStr; 
    int dummyInt; 

     sr = gcnew StreamReader("C:\\testsize.txt"); 

     while((dummyStr = sr->ReadLine())!= nullptr) 
     { 
      dummyInt++; 
     } 
     sr->Close(); 

     sr = gcnew StreamReader("C:\\testsize.txt"); 
     strArray = gcnew array<String^>(dummyInt); 
     for(int i=0; i < strArray->Length; i++) 
     { 
      strArray[i] = sr->ReadLine(); 
     } 
     richTextBox1->Lines = strArray; 

ich habe ähnliches Code-Snippet in meinem Projekt, und die Ausnahme erscheint, wenn ich die Zeile richTextBox1-> Lines = strArray mache.

Ich habe die Dokumentation des Rich Textbox gelesen, und es sagt, die maximale Grenze ist 64KB Wert von Zeichen, aber das macht Sinn auf halbem Weg, wie ich den Text laden kann, aber ich denke, das Programm hat ein Problem Dumping danach.

Irgendwelche Ideen? Ich habe versucht, vielleicht einige benutzerdefinierte Kontrollen ohne ein Limit zu finden, aber bis jetzt keinen Erfolg.

+0

Könnte mir mit einem benutzerdefinierten Steuerelement helfen, wenn Sie uns wissen, welche Plattform/API das ist. Ich kenne QT nicht, also könnte es das sein? – DeusAduro

+0

Es ist unter Windows Vista, VS2008, C++ – Dinoo

Antwort

1

Soweit eine große Menge an Text in eine reiche Bearbeitung dumping wird dies in der Regel quälend langsam sein, nehmen Sie zum Beispiel Notizblock, versuchen Sie es und öffnen Sie eine 2MB-Datei mit ihm. Ich denke, die Art und Weise, wie fortgeschrittenere Texteditoren mit diesen umgehen, ist eine "virtuelle Kontrolle". Ich weiß, dass diese häufig mit Listensteuerelementen verwendet werden, und ich würde auch mit Textfeldern denken. Sie funktionieren/funktionieren grundsätzlich genauso wie Ihre normale alltägliche Kontrolle, aber ohne zu versuchen, Unmengen von Text zu einem Zeitpunkt zu rendern, haben sie virtuellen Raum 'außerhalb des Bildschirms'.

Soweit Ihr nicht genügend Speicherproblem ... Ich bin verwirrt Sie sagen, der Fehler passiert in der letzten Zeile des Beispielcodes, wenn Sie versuchen und Ihren Text darauf ablegen. Sie erwähnen auch, dass das Limit 64KB ist, also unter der Annahme, dass Ihre Datei riesig ist, wie Sie sagen ... es macht Sinn, Sie erhalten einen Fehler dort haben Sie versucht, mehr als 64 KB Text in eine 64 KB begrenzte Box zu entleeren. Fehle ich etwas?

Edit Ich lese einige der Frage Ich sehe, was Sie jetzt fragen, so in dem einfachen Programm erhalten Sie einen Fehler, nachdem alles geladen ist getan, wenn das Programm beendet. Werfen Sie einen Debug-Punkt in Ihre Destruktoren und sehen Sie genau, wo dieser Fehler auftritt.

Edit 2 Nun, da ich weiß, welches System Sie sind, ging ich und sah, ist die Dokumentation ein wenig komplexer als 64K Grenze. Das bezieht sich zunächst nicht auf 64 KB, sondern auf 64000 Zeichen. Beachten Sie auch, dass Sie dieses Limit beliebig ändern können. Zweitens, wenn Sie mit SF_TEXT und nicht mit SF_RTF streamen, hat dieses Limit keine Wirkung, was ich mir vorstellen könnte, was hinter der .NET-Oberfläche passiert.

+0

Auf das Speicherproblem, Ich erwähnte es, weil ich in dem einfachen Programm Code laden kann (auch wenn langsam) und dann durch es und alles scrollen. Ich bekomme die Ausnahme, wenn ich versuche, das Programm zu schließen (direkt vor der "return 0;" - Anweisung). In dem komplexeren Projekt erhalte ich die Ausnahme, wenn ich versuche, den Code zu laden. Ich habe versucht, darauf hinzuweisen, dass es möglich ist, 90 MB Code in die 64KB Textbox zu laden, deshalb wurde ich geknallt, haha. – Dinoo

+0

Ya sorry ich fing das bei der zweiten durchlesen. Und es scheint ziemlich komisch ...Welche Plattform/API verwendest du? – DeusAduro

+0

Kein Problem. Es ist unter Vista, VS 2008, C++. Also ich denke .NET. – Dinoo

Verwandte Themen