0

我在富文本框中存储大量文本时遇到问题。

我正在尝试读取一个相当大的文本文件(从 90mb 到 450mb 的任何地方),并将我读过的内容放在一个富文本框中。它在一个简单的程序中工作,但是当我在一个复杂的程序中工作时,我得到一个 OutOfMemory 异常。

需要注意的一点是,当我退出我的简单程序时,我在程序返回 0 之前得到了 OutOfMemory 异常。

这是我的简单程序的代码:

    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;

我的项目中有类似的代码片段,当我执行richTextBox1->Lines = strArray 行时会弹出异常。

我已经阅读了富文本框的文档,它说最大限制是 64KB 的字符,但这在中途是有道理的,因为我可以加载文本,但我猜程序在之后转储它时有问题。

有任何想法吗?我一直在尝试寻找一些没有限制的自定义控件,但到目前为止还没有成功。

4

1 回答 1

1

至于将大量文本转储到富编辑中,这通常会非常缓慢,以记事本为例,尝试用它打开一个 2MB 的文件。我认为更高级的文本编辑器处理这些问题的方式是通过“虚拟控件”,我知道这些通常与列表控件一起使用,我也会认为与文本框一起使用。它们的行为/功能基本上与您正常的日常控制相同,但不尝试一次渲染大量文本,它们具有“屏幕空间之外”的虚拟空间。

至于你的内存不足问题......我很困惑你说当你尝试将文本转储到它时,错误发生在示例代码的最后一行。您还提到限制是 64KB,所以现在假设您的文件很大,就像您说的那样……您在尝试将超过 64KB 的文本转储到 64KB 的有限框中时遇到错误是有道理的。我错过了什么吗?

编辑我重新阅读了一些我看到你现在问的问题,所以在简单的程序中,当程序退出时,在所有内容加载完成后,你会收到一个错误。将调试点放入您的析构函数中,并查看此错误发生的确切位置。

编辑 2现在我知道您使用的是什么系统,我去看了一下,文档比 64K 限制要复杂一些。首先不是指 64 KB,而是 64000 个字符。另请注意,您可以随意更改此限制。其次,如果您使用 SF_TEXT 而不是 SF_RTF 进行流式传输,则此限制无效,我想这就是 .NET 接口所见背后发生的事情。

于 2009-07-16T17:26:24.340 回答