gpt4 book ai didi

c# - 奇怪的控制台 MoveBufferArea IOException

转载 作者:太空宇宙 更新时间:2023-11-03 20:43:06 24 4
gpt4 key购买 nike

当我偶然发现 Console.MoveBufferArea 方法的一个非常奇怪的行为时,我正在构建一个“反向控制台”(以便写入的行将自己附加到顶部而不是底部):

    static void Main()
{
for (var _linesWritten = 0; _linesWritten < 1000; _linesWritten++)
{
var _height = Math.Min(Console.BufferHeight-1, _linesWritten);
Console.MoveBufferArea(0, 0, Console.BufferWidth, _height, 0, 1);
Console.SetCursorPosition(0, 0);
Console.WriteLine("Line {0} aaaaaaaaaa", _linesWritten);
Console.ResetColor();
}
}

当我调用它固定次数时,它会抛出一个 System.IO.IOException 消息:“没有足够的存储空间来处理这个命令”。我发现这取决于移动的缓冲区大小。当我更改 Console.BufferWidth 属性时,抛出异常之前写入的行数会发生变化。

Screenshot

我正在运行 Windows 7 x64 @ Corei7, 6gb DDR3,所以存储应该不是问题....有人知道哪里出了问题吗?

最佳答案

导致异常的 API 函数是 ReadConsoleOutput()。 SDK 文档有一些相关的小字:

lpBuffer:

A pointer to a destination buffer that receives the data read from the console screen buffer. This pointer is treated as the origin of a two-dimensional array of CHAR_INFO structures whose size is specified by the dwBufferSize parameter. The total size of the array must be less than 64K.

我把相关的短语加粗了。当您的程序尝试滚动超过 200 行时(201 x 80 x 4 = 64320 字节,奇怪的是与 65536 略有偏差),您的程序将崩溃。它可以说是 Console.MoveBufferArea() 中的一个错误,它不会检查此限制,也不会尝试解决它,这很容易做到。您可以在 connect.microsoft.com 报告错误

现在,您必须限制行数,以使缓冲区大小不超过限制。

关于c# - 奇怪的控制台 MoveBufferArea IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1863989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com